<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://fiscomp.if.ufrgs.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Joaomesquita</id>
	<title>Física Computacional - Contribuições do usuário [pt-br]</title>
	<link rel="self" type="application/atom+xml" href="http://fiscomp.if.ufrgs.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Joaomesquita"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Especial:Contribui%C3%A7%C3%B5es/Joaomesquita"/>
	<updated>2026-06-15T07:29:12Z</updated>
	<subtitle>Contribuições do usuário</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5167</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5167"/>
		<updated>2021-05-25T13:43:33Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{\langle i,j \rangle}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema e &amp;lt;math&amp;gt;\beta = 1&amp;lt;/math&amp;gt;. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q \in [2, 10]|Q\in\mathbb{Z}&amp;lt;/math&amp;gt;. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Contudo, a medida de relevância para os casos em que &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; é na verdade a susceptibilidade magnética, que ainda indica com qual facilidade o sistema muda seu alinhamento e também pode indicar a transição de fase. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;lt; 5 ===&lt;br /&gt;
==== Correspondência com o modelo de Ising ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia, calor específico e susceptibilidade magnética para Q = 2 e L = 64 utilizando algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = 2 e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_q2_.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q2.png|thumb|center|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Podemos ver que os dados resultantes das simulações para o modelo de Potts com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; de fato recriam o comportamento esperado pelo modelo de Ising. Observamos que tanto o calor específico como a susceptibilidade magnética aumentam drásticamente conforme se aproximam de &amp;lt;math&amp;gt;T = 1,1&amp;lt;/math&amp;gt;. Como foi elaborado acima, o modelo de Ising tem a hamiltoniana igual a hamiltoniana do modelo de Potts a menos de uma constante, que é equivalente a &amp;lt;math&amp;gt;\sum_{\langle i, j\rangle}\frac{J}{2}&amp;lt;/math&amp;gt;, o que corrobora que a temperatura crítica para o modelo de Potts, com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; seja aproximadamente &amp;lt;math&amp;gt;T_c \approx 1,1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Demais casos ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Agrupamos aqui os resultados obtidos para &amp;lt;math&amp;gt;Q \leq 4&amp;lt;/math&amp;gt; porque se descobriu que para o caso bidimensional o modelo de Potts muda de tipo de transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt;, passando a apresentar uma transição de primeira ordem&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;Gerard Barkema, Jan de Boer, Numerical Study of Phase Transitions in Potts Models, 1991&amp;lt;/ref&amp;gt;. Como mostrado por Barkema &amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, a transição de fase ocorre em temperaturas críticas que variam para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, e aqui encontramos que são aproximadamente &amp;lt;math&amp;gt;1,0&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q=3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;0,9&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;, e &amp;lt;math&amp;gt;1,1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; como dito acima. &lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;gt; 4 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De acordo com a previsão de Barkema&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt; a transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt; passa a ser de primeira ordem, e nossos resultados estão de acordo com isso, pois há uma variação muito mais brusca nas curvas das energias médias do sistema em comparação às variações para &amp;lt;math&amp;gt;Q \leq 4&amp;lt;/math&amp;gt;, que por sua vez tem uma curva muito mais suave. Além disso, podemos ver que o comportamento dos desvios se torna muito mais único para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, isso porque a transição ocorre de maneira contínua e assim há apenas um pico nos valores das energias, que por sua vez se torna fortemente dependente de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Outro comentário importante é que os resultados obtidos utilizando o algoritmo de Metropolis e o algoritmo de banho térmico são extremamente similares, apenas havendo uma diferença nos desvios das medidas, que são menores para o algoritmo de banho térmico já que este tem uma aceitação das trocas de spins muito mais alta que a do Metropolis. Isso se observa em todos os &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Comparação entre algoritmo de Metropolis-Hasting e banho térmico para baixas temperaturas ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico (vermelho) para Q = 2 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico (vermelho) para Q = 3 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 4 e T = 0.3 e T = 0.4&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.4.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.4|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Podemos observar que no caso do algoritmo de Metropolis o sistema tem extrema dificuldade de trocar de estado, ficando quase constantemente no mesmo valor de energia. O algoritmo de banho térmico porém apresenta uma flutuação muito mais coerente com a distribuição de Boltzmann para o sistema nessa temperatura. Isso mostra que para baixas temperaturas o algoritmo do banho térmico é muito mais eficiente que o de Metropolis, que por sua vez é impraticável para temperaturas muito baixas.&lt;br /&gt;
&lt;br /&gt;
É importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a(s) outra(s) e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações passam por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Animações comparando a evolução do sistema usando o algoritmo de Metropolis (esquerda) e o algoritmo de banho térmico (direita).&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: Q10_T025_MT.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de Metropolis com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|[[Arquivo: Q10_T025_HB.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de banho térmico com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note que o sistema com o algoritmo de Metropolis fica &amp;quot;preso&amp;quot; em um estado com uma faixa de &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt; no meio de um mar de spins &amp;lt;math&amp;gt;q = 1&amp;lt;/math&amp;gt;, mas não consegue se alinhar até o final da animação. Isso representa um estado de equilíbrio instável para o modelo, mas o sistema fica preso nessa condição por limitação do algoritmo de Metropolis, que tem baixíssima eficiência para baixas temperaturas. O sistema com o algoritmo de banho térmico por outro lado consegue &amp;quot;dissolver&amp;quot; os aglomerados de spins diferentes que mostra haviam no começo da animação e no fim da animação todos os spins estão alinhados, demonstrando a melhor eficiência desse algoritmo nessas condições.&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5166</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5166"/>
		<updated>2021-05-25T13:39:16Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{\langle i,j \rangle}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema e &amp;lt;math&amp;gt;\beta = 1&amp;lt;/math&amp;gt;. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q \in [2, 10]|Q\in\mathbb{Z}&amp;lt;/math&amp;gt;. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Contudo, a medida de relevância para os casos em que &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; é na verdade a susceptibilidade magnética, que ainda indica com qual facilidade o sistema muda seu alinhamento e também pode indicar a transição de fase. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;lt; 5 ===&lt;br /&gt;
==== Correspondência com o modelo de Ising ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia, calor específico e susceptibilidade magnética para Q = 2 e L = 64 utilizando algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = 2 e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_q2_.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q2.png|thumb|center|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a(s) outra(s) e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações passam por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
Podemos ver que os dados resultantes das simulações para o modelo de Potts com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; de fato recriam o comportamento esperado pelo modelo de Ising. Observamos que tanto o calor específico como a susceptibilidade magnética aumentam drásticamente conforme se aproximam de &amp;lt;math&amp;gt;T = 1,1&amp;lt;/math&amp;gt;. Como foi elaborado acima, o modelo de Ising tem a hamiltoniana igual a hamiltoniana do modelo de Potts a menos de uma constante, que é equivalente a &amp;lt;math&amp;gt;\sum_{\langle i, j\rangle}\frac{J}{2}&amp;lt;/math&amp;gt;, o que corrobora que a temperatura crítica para o modelo de Potts, com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; seja aproximadamente &amp;lt;math&amp;gt;T_c \approx 1,1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Demais casos ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Agrupamos aqui os resultados obtidos para &amp;lt;math&amp;gt;Q \leq 4&amp;lt;/math&amp;gt; porque se descobriu que para o caso bidimensional o modelo de Potts muda de tipo de transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt;, passando a apresentar uma transição de primeira ordem&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;Gerard Barkema, Jan de Boer, Numerical Study of Phase Transitions in Potts Models, 1991&amp;lt;/ref&amp;gt;. Como mostrado por Barkema &amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, a transição de fase ocorre em temperaturas críticas que variam para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, e aqui encontramos que são aproximadamente &amp;lt;math&amp;gt;1,0&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q=3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;0,9&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;, e &amp;lt;math&amp;gt;1,1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; como dito acima. &lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;gt; 4 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De acordo com a previsão de Barkema&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt; a transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt; passa a ser de primeira ordem, e nossos resultados estão de acordo com isso, pois há uma variação muito mais brusca nas curvas das energias médias do sistema em comparação às variações para &amp;lt;math&amp;gt;Q \leq 4&amp;lt;/math&amp;gt;, que por sua vez tem uma curva muito mais suave. Além disso, podemos ver que o comportamento dos desvios se torna muito mais único para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, isso porque a transição ocorre de maneira contínua e assim há apenas um pico nos valores das energias, que por sua vez se torna fortemente dependente de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Outro comentário importante é que os resultados obtidos utilizando o algoritmo de Metropolis e o algoritmo de banho térmico são extremamente similares, apenas havendo uma diferença nos desvios das medidas, que são menores para o algoritmo de banho térmico já que este tem uma aceitação das trocas de spins muito mais alta que a do Metropolis. Isso se observa em todos os &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Comparação entre algoritmo de Metropolis-Hasting e banho térmico para baixas temperaturas ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico (vermelho) para Q = 2 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico (vermelho) para Q = 3 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 4 e T = 0.3 e T = 0.4&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.4.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.4|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Podemos observar que no caso do algoritmo de Metropolis o sistema tem extrema dificuldade de trocar de estado, ficando quase constantemente no mesmo valor de energia. O algoritmo de banho térmico porém apresenta uma flutuação muito mais coerente com a distribuição de Boltzmann para o sistema nessa temperatura. Isso mostra que para baixas temperaturas o algoritmo do banho térmico é muito mais eficiente que o de Metropolis, que por sua vez é impraticável para temperaturas muito baixas.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Animações comparando a evolução do sistema usando o algoritmo de Metropolis (esquerda) e o algoritmo de banho térmico (direita).&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: Q10_T025_MT.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de Metropolis com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|[[Arquivo: Q10_T025_HB.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de banho térmico com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note que o sistema com o algoritmo de Metropolis fica &amp;quot;preso&amp;quot; em um estado com uma faixa de &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt; no meio de um mar de spins &amp;lt;math&amp;gt;q = 1&amp;lt;/math&amp;gt;, mas não consegue se alinhar até o final da animação. Isso representa um estado de equilíbrio instável para o modelo, mas o sistema fica preso nessa condição por limitação do algoritmo de Metropolis, que tem baixíssima eficiência para baixas temperaturas. O sistema com o algoritmo de banho térmico por outro lado consegue &amp;quot;dissolver&amp;quot; os aglomerados de spins diferentes que mostra haviam no começo da animação e no fim da animação todos os spins estão alinhados, demonstrando a melhor eficiência desse algoritmo nessas condições.&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5165</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5165"/>
		<updated>2021-05-25T13:24:25Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{\langle i,j \rangle}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema e &amp;lt;math&amp;gt;\beta = 1&amp;lt;/math&amp;gt;. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q \in [2, 10]|Q\in\mathbb{Z}&amp;lt;/math&amp;gt;. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Contudo, a medida de relevância para os casos em que &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; é na verdade a susceptibilidade magnética, que ainda indica com qual facilidade o sistema muda seu alinhamento e também pode indicar a transição de fase. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;lt; 5 ===&lt;br /&gt;
==== Correspondência com o modelo de Ising ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia, calor específico e susceptibilidade magnética para Q = 2 e L = 64 utilizando algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = 2 e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_q2_.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q2.png|thumb|center|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a(s) outra(s) e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações passam por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
Podemos ver que os dados resultantes das simulações para o modelo de Potts com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; de fato recriam o comportamento esperado pelo modelo de Ising. Observamos que tanto o calor específico como a susceptibilidade magnética aumentam drásticamente conforme se aproximam de &amp;lt;math&amp;gt;T = 1,1&amp;lt;/math&amp;gt;. Como foi elaborado acima, o modelo de Ising tem a hamiltoniana igual a hamiltoniana do modelo de Potts a menos de uma constante, que é equivalente a &amp;lt;math&amp;gt;\sum_{\langle i, j\rangle}\frac{J}{2}&amp;lt;/math&amp;gt;, o que corrobora que a temperatura crítica para o modelo de Potts, com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; seja aproximadamente &amp;lt;math&amp;gt;T_c \approx 1,1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Demais casos ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Agrupamos aqui os resultados obtidos para &amp;lt;math&amp;gt;Q \leq 4&amp;lt;/math&amp;gt; porque se descobriu que para o caso bidimensional o modelo de Potts muda de tipo de transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt;, passando a apresentar uma transição de primeira ordem&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;Gerard Barkema, Jan de Boer, Numerical Study of Phase Transitions in Potts Models, 1991&amp;lt;/ref&amp;gt;. Como mostrado por Barkema &amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, a transição de fase ocorre em temperaturas críticas que variam para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, e aqui encontramos que são aproximadamente &amp;lt;math&amp;gt;1,0&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q=3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;0,9&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;, e &amp;lt;math&amp;gt;1,1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; como dito acima. &lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;gt; 4 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De acordo com a previsão de Barkema&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt; a transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt; passa a ser de primeira ordem, e nossos resultados estão de acordo com isso, pois há uma variação muito mais brusca nas curvas das energias médias do sistema em comparação às variações para &amp;lt;math&amp;gt;Q \leq 4&amp;lt;/math&amp;gt;, que por sua vez tem uma curva muito mais suave. Além disso, podemos ver que o comportamento dos desvios se torna muito mais único para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, isso porque a transição ocorre de maneira contínua e assim há apenas um pico nos valores das energias, que por sua vez se torna fortemente dependente de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Outro comentário importante é que os resultados obtidos utilizando o algoritmo de Metropolis e o algoritmo de banho térmico são extremamente similares, apenas havendo uma diferença nos desvios das medidas, que são menores para o algoritmo de banho térmico já que este tem uma aceitação das trocas de spins muito mais alta que a do Metropolis. Isso se observa em todos os &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Comparação entre algoritmo de Metropolis-Hasting e banho térmico para baixas temperaturas ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico (vermelho) para Q = 2 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico (vermelho) para Q = 3 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 4 e T = 0.3 e T = 0.4&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.4.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.4|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Animações comparando a evolução do sistema usando o algoritmo de Metropolis (esquerda) e o algoritmo de banho térmico (direita).&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: Q10_T025_MT.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de Metropolis com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|[[Arquivo: Q10_T025_HB.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de banho térmico com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note que o sistema com o algoritmo de Metropolis fica &amp;quot;preso&amp;quot; em um estado com uma faixa de &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt; no meio de um mar de spins &amp;lt;math&amp;gt;q = 1&amp;lt;/math&amp;gt;, mas não consegue se alinhar até o final da animação. Isso representa um estado de equilíbrio instável para o modelo, mas o sistema fica preso nessa condição por limitação do algoritmo de Metropolis, que tem baixíssima eficiência para baixas temperaturas. O sistema com o algoritmo de banho térmico por outro lado consegue &amp;quot;dissolver&amp;quot; os aglomerados de spins diferentes que mostra haviam no começo da animação e no fim da animação todos os spins estão alinhados, demonstrando a melhor eficiência desse algoritmo nessas condições.&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5164</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5164"/>
		<updated>2021-05-25T13:03:49Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{\langle i,j \rangle}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema e &amp;lt;math&amp;gt;\beta = 1&amp;lt;/math&amp;gt;. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q \in [2, 10]|Q\in\mathbb{Z}&amp;lt;/math&amp;gt;. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Contudo, a medida de relevância para os casos em que &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; é na verdade a susceptibilidade magnética, que ainda indica com qual facilidade o sistema muda seu alinhamento e também pode indicar a transição de fase. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;lt; 5 ===&lt;br /&gt;
==== Correspondência com o modelo de Ising ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia, calor específico e susceptibilidade magnética para Q = 2 e L = 64 utilizando algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = 2 e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_q2_.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q2.png|thumb|center|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a(s) outra(s) e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações passam por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
Podemos ver que os dados resultantes das simulações para o modelo de Potts com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; de fato recriam o comportamento esperado pelo modelo de Ising. Observamos que tanto o calor específico como a susceptibilidade magnética aumentam drásticamente conforme se aproximam de &amp;lt;math&amp;gt;T = 1,1&amp;lt;/math&amp;gt;. Como foi elaborado acima, o modelo de Ising tem a hamiltoniana igual a hamiltoniana do modelo de Potts a menos de uma constante, que é equivalente a &amp;lt;math&amp;gt;\sum_{\langle i, j\rangle}\frac{J}{2}&amp;lt;/math&amp;gt;, o que corrobora que a temperatura crítica para o modelo de Potts, com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; seja aproximadamente &amp;lt;math&amp;gt;T_c \approx 1,1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Demais casos ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Agrupamos aqui os resultados obtidos para &amp;lt;math&amp;gt;Q \leq 4&amp;lt;/math&amp;gt; porque se descobriu que para o caso bidimensional o modelo de Potts muda de tipo de transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt;, passando a apresentar uma transição de primeira ordem&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;Gerard Barkema, Jan de Boer, Numerical Study of Phase Transitions in Potts Models, 1991&amp;lt;/ref&amp;gt;. Como mostrado por Barkema &amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, a transição de fase ocorre em temperaturas críticas que variam para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, e aqui encontramos que são aproximadamente &amp;lt;math&amp;gt;1,0&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q=3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;0,9&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;, e &amp;lt;math&amp;gt;1,1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; como dito acima. &lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;gt; 4 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De acordo com a previsão de Barkema&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt; a transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt; passa a ser de primeira ordem, e nossos resultados estão de acordo com isso, pois há uma variação muito mais brusca nas curvas das energias médias do sistema em comparação às variações para &amp;lt;math&amp;gt;Q \leq 4&amp;lt;/math&amp;gt;, que por sua vez tem uma curva muito mais suave. Além disso, podemos ver que o comportamento dos desvios se torna muito mais único para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, isso porque a transição ocorre de maneira contínua e assim há apenas um pico nos valores das energias, que por sua vez se torna fortemente dependente de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Comparação entre algoritmo de Metropolis-Hasting e banho térmico para baixas temperaturas ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico (vermelho) para Q = 2 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico (vermelho) para Q = 3 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 4 e T = 0.3 e T = 0.4&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.4.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.4|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Animações comparando a evolução do sistema usando o algoritmo de Metropolis (esquerda) e o algoritmo de banho térmico (direita).&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: Q10_T025_MT.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de Metropolis com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|[[Arquivo: Q10_T025_HB.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de banho térmico com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note que o sistema com o algoritmo de Metropolis fica &amp;quot;preso&amp;quot; em um estado com uma faixa de &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt; no meio de um mar de spins &amp;lt;math&amp;gt;q = 1&amp;lt;/math&amp;gt;, mas não consegue se alinhar até o final da animação. Isso representa um estado de equilíbrio instável para o modelo, mas o sistema fica preso nessa condição por limitação do algoritmo de Metropolis, que tem baixíssima eficiência para baixas temperaturas. O sistema com o algoritmo de banho térmico por outro lado consegue &amp;quot;dissolver&amp;quot; os aglomerados de spins diferentes que mostra haviam no começo da animação e no fim da animação todos os spins estão alinhados, demonstrando a melhor eficiência desse algoritmo nessas condições.&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5163</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5163"/>
		<updated>2021-05-25T12:59:27Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{\langle i,j \rangle}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema e &amp;lt;math&amp;gt;\beta = 1&amp;lt;/math&amp;gt;. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q \in [2, 10]|Q\in\mathbb{Z}&amp;lt;/math&amp;gt;. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Contudo, a medida de relevância para os casos em que &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; é na verdade a susceptibilidade magnética, que ainda indica com qual facilidade o sistema muda seu alinhamento e também pode indicar a transição de fase. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;lt; 5 ===&lt;br /&gt;
==== Correspondência com o modelo de Ising ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia, calor específico e susceptibilidade magnética para Q = 2 e L = 64 utilizando algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = 2 e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_q2_.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q2.png|thumb|center|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a(s) outra(s) e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações passam por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
Podemos ver que os dados resultantes das simulações para o modelo de Potts com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; de fato recriam o comportamento esperado pelo modelo de Ising. Observamos que tanto o calor específico como a susceptibilidade magnética aumentam drásticamente conforme se aproximam de &amp;lt;math&amp;gt;T = 1,1&amp;lt;/math&amp;gt;. Como foi elaborado acima, o modelo de Ising tem a hamiltoniana igual a hamiltoniana do modelo de Potts a menos de uma constante, que é equivalente a &amp;lt;math&amp;gt;\sum_{\langle i, j\rangle}\frac{J}{2}&amp;lt;/math&amp;gt;, o que corrobora que a temperatura crítica para o modelo de Potts, com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; seja aproximadamente &amp;lt;math&amp;gt;T_c \approx 1,1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Demais casos ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Agrupamos aqui os resultados obtidos para &amp;lt;math&amp;gt;Q \leq 4&amp;lt;/math&amp;gt; porque se descobriu que para o caso bidimensional o modelo de Potts muda de tipo de transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt;, passando a apresentar uma transição de primeira ordem&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;Gerard Barkema, Jan de Boer, Numerical Study of Phase Transitions in Potts Models, 1991&amp;lt;/ref&amp;gt;. Como mostrado por Barkema &amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, a transição de fase ocorre em temperaturas críticas que variam para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, e aqui encontramos que são aproximadamente &amp;lt;math&amp;gt;1,0&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q=3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;0,9&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;, e &amp;lt;math&amp;gt;1,1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; como dito acima. &lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;gt; 4 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De acordo com a previsão de Barkema&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt; a transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt; passa a ser de primeira ordem, e nossos resultados corroboram com isso, pois há uma variação muito mais brusca nas curvas das energias médias do sistema em comparação às variações para &amp;lt;math&amp;gt;Q \leq &amp;lt;/math&amp;gt;, que por sua vez tem uma curva muito mais suave. Além disso, podemos ver que o comportamento dos desvios se torna muito mais único para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, isso porque a transição ocorre de maneira contínua e assim há apenas um pico nos valores das energias, que por sua vez se torna fortemente dependente de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Comparação entre algoritmo de Metropolis-Hasting e banho térmico para baixas temperaturas ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 2 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 3 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 4 e T = 0.3 e T = 0.4&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.4.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.4|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Animações comparando a evolução do sistema usando o algoritmo de Metropolis (esquerda) e o algoritmo de banho térmico (direita).&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: Q10_T025_MT.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de Metropolis com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|[[Arquivo: Q10_T025_HB.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de banho térmico com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note que o sistema com o algoritmo de Metropolis fica &amp;quot;preso&amp;quot; em um estado com uma faixa de &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt; no meio de um mar de spins &amp;lt;math&amp;gt;q = 1&amp;lt;/math&amp;gt;, mas não consegue se alinhar até o final da animação. Isso representa um estado de equilíbrio instável para o modelo, mas o sistema fica preso nessa condição por limitação do algoritmo de Metropolis, que tem baixíssima eficiência para baixas temperaturas. O sistema com o algoritmo de banho térmico por outro lado consegue &amp;quot;dissolver&amp;quot; os aglomerados de spins diferentes que mostra haviam no começo da animação e no fim da animação todos os spins estão alinhados, demonstrando a melhor eficiência desse algoritmo nessas condições.&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5160</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5160"/>
		<updated>2021-05-25T12:13:14Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{\langle i,j \rangle}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema e &amp;lt;math&amp;gt;\beta = 1&amp;lt;/math&amp;gt;. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q \in [2, 10]|Q\in\mathbb{Z}&amp;lt;/math&amp;gt;. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Contudo, a medida de relevância para os casos em que &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; é na verdade a susceptibilidade magnética, que ainda indica com qual facilidade o sistema muda seu alinhamento e também pode indicar a transição de fase. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;lt; 5 ===&lt;br /&gt;
==== Correspondência com o modelo de Ising ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia, calor específico e susceptibilidade magnética para Q = 2 e L = 64 utilizando algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = 2 e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_q2_.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q2.png|thumb|center|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a(s) outra(s) e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações passam por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
Podemos ver que os dados resultantes das simulações para o modelo de Potts com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; de fato recriam o comportamento esperado pelo modelo de Ising. Observamos que tanto o calor específico como a susceptibilidade magnética aumentam drásticamente conforme se aproximam de &amp;lt;math&amp;gt;T = 1,1&amp;lt;/math&amp;gt;. Como foi elaborado acima, o modelo de Ising tem a hamiltoniana igual a hamiltoniana do modelo de Potts a menos de uma constante, que é equivalente a &amp;lt;math&amp;gt;\sum_{\langle i, j\rangle}\frac{J}{2}&amp;lt;/math&amp;gt;, o que corrobora que a temperatura crítica para o modelo de Potts, com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; seja aproximadamente &amp;lt;math&amp;gt;T_c \approx 1,1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Demais casos ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Agrupamos aqui os resultados obtidos para &amp;lt;math&amp;gt;Q \leq 4&amp;lt;/math&amp;gt; porque se descobriu que para o caso bidimensional o modelo de Potts muda de tipo de transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt;, passando a apresentar uma transição de primeira ordem&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;Gerard Barkema, Jan de Boer, Numerical Study of Phase Transitions in Potts Models, 1991&amp;lt;/ref&amp;gt;. Como mostrado por Barkema &amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, a transição de fase ocorre em temperaturas críticas que variam para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, e aqui encontramos que são aproximadamente &amp;lt;math&amp;gt;1,0&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q=3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;0,9&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;, e &amp;lt;math&amp;gt;1,1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; como dito acima. &lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;gt; 4 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Comparação entre algoritmo de Metropolis-Hasting e banho térmico para baixas temperaturas ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 2 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 3 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 4 e T = 0.3 e T = 0.4&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.4.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.4|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Animações comparando a evolução do sistema usando o algoritmo de Metropolis (esquerda) e o algoritmo de banho térmico (direita).&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: Q10_T025_MT.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de Metropolis com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|[[Arquivo: Q10_T025_HB.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de banho térmico com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note que o sistema com o algoritmo de Metropolis fica &amp;quot;preso&amp;quot; em um estado com uma faixa de &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt; no meio de um mar de spins &amp;lt;math&amp;gt;q = 1&amp;lt;/math&amp;gt;, mas não consegue se alinhar até o final da animação. Isso representa um estado de equilíbrio instável para o modelo, mas o sistema fica preso nessa condição por limitação do algoritmo de Metropolis, que tem baixíssima eficiência para baixas temperaturas. O sistema com o algoritmo de banho térmico por outro lado consegue &amp;quot;dissolver&amp;quot; os aglomerados de spins diferentes que mostra haviam no começo da animação e no fim da animação todos os spins estão alinhados, demonstrando a melhor eficiência desse algoritmo nessas condições.&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5159</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5159"/>
		<updated>2021-05-25T08:09:13Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{\langle i,j \rangle}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema e &amp;lt;math&amp;gt;\beta = 1&amp;lt;/math&amp;gt;. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q \in [2, 10]|Q\in\mathbb{Z}&amp;lt;/math&amp;gt;. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Contudo, a medida de relevância para os casos em que &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; é na verdade a susceptibilidade magnética, que ainda indica com qual facilidade o sistema muda seu alinhamento e também pode indicar a transição de fase. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;lt; 5 ===&lt;br /&gt;
==== Correspondência com o modelo de Ising ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia, calor específico e susceptibilidade magnética para Q = 2 e L = 64 utilizando algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = 2 e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_q2_.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q2.png|thumb|center|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a(s) outra(s) e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações passam por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
Podemos ver que os dados resultantes das simulações para o modelo de Potts com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; de fato recriam o comportamento esperado pelo modelo de Ising. Observamos que tanto o calor específico como a susceptibilidade magnética aumentam drásticamente conforme se aproximam de &amp;lt;math&amp;gt;T = 1,1&amp;lt;/math&amp;gt;. Como foi elaborado acima, o modelo de Ising tem a hamiltoniana igual a hamiltoniana do modelo de Potts a menos de uma constante, que é equivalente a &amp;lt;math&amp;gt;\sum_{\langle i, j\rangle}\frac{J}{2}&amp;lt;/math&amp;gt;, o que corrobora que a temperatura crítica para o modelo de Potts, com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; seja aproximadamente &amp;lt;math&amp;gt;T_c \approx 1,1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Demais casos ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Agrupamos aqui os resultados obtidos para &amp;lt;math&amp;gt;Q \leq 4&amp;lt;/math&amp;gt; porque se descobriu que para o caso bidimensional o modelo de Potts muda de tipo de transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt;, passando a apresentar uma transição de primeira ordem&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;Gerard Barkema, Jan de Boer, Numerical Study of Phase Transitions in Potts Models, 1991&amp;lt;/ref&amp;gt;. Como mostrado por Barkema &amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, a transição de fase ocorre em temperaturas críticas que variam para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, e aqui encontramos que são aproximadamente &amp;lt;math&amp;gt;1,0&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q=3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;0,9&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;, e &amp;lt;math&amp;gt;1,1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; como dito acima. &lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;gt; 4 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Comparação entre algoritmo de Metropolis-Hasting e banho térmico para baixas temperaturas ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 2 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 3 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 4 e T = 0.3 e T = 0.4&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.4.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.4|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Animações comparando a evolução do sistema usando o algoritmo de Metropolis (esquerda) e o algoritmo de banho térmico (direita).&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: Q10_T025_MT.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de Metropolis com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|[[Arquivo: Q10_T025_HB.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de banho térmico com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note que o sistema com o algoritmo de Metropolis fica &amp;quot;preso&amp;quot; em um estado com uma faixa de &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt; no meio de um mar de spins &amp;lt;math&amp;gt;q = 1&amp;lt;/math&amp;gt;, mas não consegue se alinhar até o final da animação. Isso representa um estado de equilíbrio instável para o modelo, mas o sistema fica preso nessa condição por limitação do algoritmo de Metropolis, que tem baixíssima eficiência para baixas temperaturas. O sistema com o algoritmo de banho térmico por outro lado consegue &amp;quot;dissolver&amp;quot; os aglomerados de spins diferentes que mostra haviam no começo da animação e no fim da animação todos os spins estão alinhados, demonstrando a melhor eficiência desse algoritmo nessas condições.&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5158</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5158"/>
		<updated>2021-05-25T07:59:00Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{\langle i,j \rangle}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema e &amp;lt;math&amp;gt;\beta = 1&amp;lt;/math&amp;gt;. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q \in [2, 10]|Q\in\mathbb{Z}&amp;lt;/math&amp;gt;. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Contudo, a medida de relevância para os casos em que &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; é na verdade a susceptibilidade magnética, que ainda indica com qual facilidade o sistema muda seu alinhamento e também pode indicar a transição de fase. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;lt; 5 ===&lt;br /&gt;
==== Correspondência com o modelo de Ising ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia, calor específico e susceptibilidade magnética para Q = 2 e L = 64 utilizando algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = 2 e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_q2_.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q2.png|thumb|center|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a(s) outra(s) e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações passam por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
Podemos ver que os dados resultantes das simulações para o modelo de Potts com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; de fato recriam o comportamento esperado pelo modelo de Ising. Observamos que tanto o calor específico como a susceptibilidade magnética aumentam drásticamente conforme se aproximam de &amp;lt;math&amp;gt;T = 1,1&amp;lt;/math&amp;gt;. Como foi elaborado acima, o modelo de Ising tem a hamiltoniana igual a hamiltoniana do modelo de Potts a menos de uma constante, que é equivalente a &amp;lt;math&amp;gt;\sum_{\langle i, j\rangle}\frac{J}{2}&amp;lt;/math&amp;gt;, o que corrobora que a temperatura crítica para o modelo de Potts, com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; seja aproximadamente &amp;lt;math&amp;gt;T_c \approx 1,1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Demais casos ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Agrupamos aqui os resultados obtidos para &amp;lt;math&amp;gt;Q \leq 4&amp;lt;/math&amp;gt; porque se descobriu que para o caso bidimensional o modelo de Potts muda de tipo de transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt;, passando a apresentar uma transição de primeira ordem&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;Gerard Barkema, Jan de Boer, Numerical Study of Phase Transitions in Potts Models, 1991&amp;lt;/ref&amp;gt;. Como mostrado por Barkema &amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, a transição de fase ocorre em temperaturas críticas que variam para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, e aqui encontramos que são aproximadamente &amp;lt;math&amp;gt;1,0&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q=3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;0,9&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;, e &amp;lt;math&amp;gt;1,1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; como dito acima. &lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;gt; 4 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Comparação entre algoritmo de Metropolis-Hasting e banho térmico para baixas temperaturas ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 2 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 3 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 4 e T = 0.3 e T = 0.4&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.4.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.4|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Animações comparando a evolução do sistema usando o algoritmo de Metropolis (esquerda) e o algoritmo de banho térmico (direita).&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: Q10_T025_MT.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de Metropolis com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|[[Arquivo: Q10_T025_HB.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de banho térmico com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Q10_T025_HB.gif&amp;diff=5157</id>
		<title>Arquivo:Q10 T025 HB.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Q10_T025_HB.gif&amp;diff=5157"/>
		<updated>2021-05-25T07:58:36Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Q10_T025_MT.gif&amp;diff=5156</id>
		<title>Arquivo:Q10 T025 MT.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Q10_T025_MT.gif&amp;diff=5156"/>
		<updated>2021-05-25T07:58:09Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5155</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5155"/>
		<updated>2021-05-25T07:55:34Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{\langle i,j \rangle}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema e &amp;lt;math&amp;gt;\beta = 1&amp;lt;/math&amp;gt;. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q \in [2, 10]|Q\in\mathbb{Z}&amp;lt;/math&amp;gt;. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Contudo, a medida de relevância para os casos em que &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; é na verdade a susceptibilidade magnética, que ainda indica com qual facilidade o sistema muda seu alinhamento e também pode indicar a transição de fase. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;lt; 5 ===&lt;br /&gt;
==== Correspondência com o modelo de Ising ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia, calor específico e susceptibilidade magnética para Q = 2 e L = 64 utilizando algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = 2 e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_q2_.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q2.png|thumb|center|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a(s) outra(s) e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações passam por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
Podemos ver que os dados resultantes das simulações para o modelo de Potts com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; de fato recriam o comportamento esperado pelo modelo de Ising. Observamos que tanto o calor específico como a susceptibilidade magnética aumentam drásticamente conforme se aproximam de &amp;lt;math&amp;gt;T = 1,1&amp;lt;/math&amp;gt;. Como foi elaborado acima, o modelo de Ising tem a hamiltoniana igual a hamiltoniana do modelo de Potts a menos de uma constante, que é equivalente a &amp;lt;math&amp;gt;\sum_{\langle i, j\rangle}\frac{J}{2}&amp;lt;/math&amp;gt;, o que corrobora que a temperatura crítica para o modelo de Potts, com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; seja aproximadamente &amp;lt;math&amp;gt;T_c \approx 1,1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Demais casos ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Agrupamos aqui os resultados obtidos para &amp;lt;math&amp;gt;Q \leq 4&amp;lt;/math&amp;gt; porque se descobriu que para o caso bidimensional o modelo de Potts muda de tipo de transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt;, passando a apresentar uma transição de primeira ordem&amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;Gerard Barkema, Jan de Boer, Numerical Study of Phase Transitions in Potts Models, 1991&amp;lt;/ref&amp;gt;. Como mostrado por &amp;lt;ref name = ARTIGO_BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, a transição de fase ocorre em temperaturas críticas que variam para cada &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, sendo aproximadamente &amp;lt;math&amp;gt;1,0&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q=3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;0,9&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;, e &amp;lt;math&amp;gt;1,1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; como dito acima. &lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;gt; 4 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Comparação entre algoritmo de Metropolis-Hasting e banho térmico para baixas temperaturas ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 2 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 3 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 4 e T = 0.3 e T = 0.4&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.4.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.4|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Animações comparando a evolução do sistema usando o algoritmo de Metropolis (esquerda) e o algoritmo de banho térmico (direita).&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: Q10_T025_MT.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de Metropolis com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|[[Arquivo: Q10_T025_HB.gif|thumb|upright=4|none|alt=Alt text|Evolução do sistema com o algoritmo de banho térmico com &amp;lt;math&amp;gt;Q = 10&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.25&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5154</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5154"/>
		<updated>2021-05-25T07:29:06Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{\langle i,j \rangle}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema e &amp;lt;math&amp;gt;\beta = 1&amp;lt;/math&amp;gt;. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q \in [2, 10]|Q\in\mathbb{Z}&amp;lt;/math&amp;gt;. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Contudo, a medida de relevância para os casos em que &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; é na verdade a susceptibilidade magnética, que ainda indica com qual facilidade o sistema muda seu alinhamento e também pode indicar a transição de fase. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;lt; 5 ===&lt;br /&gt;
==== Correspondência com o modelo de Ising ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia, calor específico e susceptibilidade magnética para Q = 2 e L = 64 utilizando algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = 2 e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_q2_.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q2.png|thumb|center|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Podemos ver que os dados resultantes das simulações para o modelo de Potts com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; de fato recria o comportamento esperado pelo modelo de Ising. Observamos que tanto o calor específico como a susceptibilidade magnética aumentam drásticamente conforme se aproximam de &amp;lt;math&amp;gt;T = 1,1&amp;lt;/math&amp;gt;. Como foi elaborado acima, o modelo de Ising tem a hamiltoniana igual a hamiltoniana do modelo de Potts a menos de uma constante, que é equivalente a &amp;lt;math&amp;gt;\sum_{\langle i, j\rangle}\frac{J}{2}&amp;lt;/math&amp;gt;, o que corrobora que a temperatura crítica para o modelo de Potts, com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; seja aproximadamente &amp;lt;math&amp;gt;T_c \approx 1,1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Demais casos ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Agrupamos aqui os resultados obtidos para &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;s porque se descobriu que para o caso bidimensional o modelo de Potts muda de tipo de transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt;, passando a apresentar uma transição de primeira ordem. &lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;gt; 4 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Comparação entre algoritmo de Metropolis-Hasting e banho térmico para baixas temperaturas ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 2 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 3 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 4 e T = 0.3 e T = 0.4&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.4.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.4|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== .... ===&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a outra e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações acabam passando por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as duas faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5153</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5153"/>
		<updated>2021-05-25T07:28:33Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{\langle i,j \rangle}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema e &amp;lt;math&amp;gt;\beta = 1&amp;lt;/math&amp;gt;. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q \in [2, 10]|Q\in\mathbb{Z}&amp;lt;/math&amp;gt;. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Contudo, a medida de relevância para os casos em que &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; é na verdade a susceptibilidade magnética, que ainda indica com qual facilidade o sistema muda seu alinhamento e também pode indicar a transição de fase. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;lt; 5 ===&lt;br /&gt;
==== Correspondência com o modelo de Ising ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia, calor específico e susceptibilidade magnética para Q = 2 e L = 64 utilizando algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = 2 e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_q2_.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Podemos ver que os dados resultantes das simulações para o modelo de Potts com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; de fato recria o comportamento esperado pelo modelo de Ising. Observamos que tanto o calor específico como a susceptibilidade magnética aumentam drásticamente conforme se aproximam de &amp;lt;math&amp;gt;T = 1,1&amp;lt;/math&amp;gt;. Como foi elaborado acima, o modelo de Ising tem a hamiltoniana igual a hamiltoniana do modelo de Potts a menos de uma constante, que é equivalente a &amp;lt;math&amp;gt;\sum_{\langle i, j\rangle}\frac{J}{2}&amp;lt;/math&amp;gt;, o que corrobora que a temperatura crítica para o modelo de Potts, com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; seja aproximadamente &amp;lt;math&amp;gt;T_c \approx 1,1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Demais casos ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Agrupamos aqui os resultados obtidos para &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;s porque se descobriu que para o caso bidimensional o modelo de Potts muda de tipo de transição de fase para &amp;lt;math&amp;gt;Q &amp;gt; 4&amp;lt;/math&amp;gt;, passando a apresentar uma transição de primeira ordem. &lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;gt; 4 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Comparação entre algoritmo de Metropolis-Hasting e banho térmico para baixas temperaturas ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 2 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 3 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 4 e T = 0.3 e T = 0.4&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.4.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.4|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== .... ===&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a outra e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações acabam passando por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as duas faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5152</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5152"/>
		<updated>2021-05-25T07:04:44Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{\langle i,j \rangle}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema e &amp;lt;math&amp;gt;\beta = 1&amp;lt;/math&amp;gt;. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q \in [2, 10]|Q\in\mathbb{Z}&amp;lt;/math&amp;gt;. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;lt; 5 ===&lt;br /&gt;
==== Correspondência com o modelo de Ising ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = 2 e L = 64 utilizando algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = 2 e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_q2_.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Podemos ver que os dados resultantes das simulações para o modelo de Potts com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; de fato recria o comportamento esperado pelo modelo de Ising. Observamos que tanto o calor específico como a susceptibilidade magnética aumentam drásticamente conforme se aproximam de &amp;lt;math&amp;gt;T = 1,1&amp;lt;/math&amp;gt;. Como foi elaborado acima, o modelo de Ising tem a hamiltoniana igual a hamiltoniana do modelo de Potts a menos de uma constante, que é equivalente a &amp;lt;math&amp;gt;\sum_{\langle i, j\rangle}\frac{J}{2}&amp;lt;/math&amp;gt;, o que corrobora que a temperatura crítica para o modelo de Potts, com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; seja aproximadamente &amp;lt;math&amp;gt;T_c \approx 1,1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Demais casos ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;gt; 4 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Comparação entre algoritmo de Metropolis-Hasting e banho térmico para baixas temperaturas ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 2 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 3 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 4 e T = 0.3 e T = 0.4&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.4.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.4|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== .... ===&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a outra e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações acabam passando por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as duas faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5151</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=5151"/>
		<updated>2021-05-25T06:52:32Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{\langle i,j \rangle}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema e &amp;lt;math&amp;gt;\beta = 1&amp;lt;/math&amp;gt;. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q \in [2, 10]|Q\in\mathbb{Z}&amp;lt;/math&amp;gt;. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;lt; 5 ===&lt;br /&gt;
==== Correspondência com o modelo de Ising ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = 2 e L = 64 utilizando algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = 2 e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_q2_.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q2.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = 2 e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Podemos ver que os dados resultantes das simulações para o modelo de Potts com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; de fato recria o comportamento esperado pelo modelo de Ising. Observamos que tanto o calor específico como a susceptibilidade magnética sugerem uma divergência próximo a &amp;lt;math&amp;gt;T = 1.1&amp;lt;/math&amp;gt;. Como foi elaborado acima, o modelo de Ising tem a hamiltoniana igual a hamiltoniana do modelo de Potts a menos de uma constante, que é equivalente a &amp;lt;math&amp;gt;sum_{\langle i, j\rangle}\frac{J}{2}&amp;lt;/math&amp;gt;, o que corrobora que a temperatura crítica para o modelo de Potts, com &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; seja aproximadamente &amp;lt;math&amp;gt;T_c \approx 1.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Demais casos ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {2,3,4} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {2,3,4} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q234.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {2,3,4} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Casos para Q &amp;gt; 4 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de Metropolis&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_metropolis_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Medidas de energia e magnetização para Q = {5,6,7,8,9,10} e L = 64 utilizando o algoritmo de banho térmico&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Energia média em função da temperatura para Q = {5,6,7,8,9,10} e L = 64.|500px]]&lt;br /&gt;
|[[Arquivo: desvio_energia_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Calor específico em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Média do valor absoluto da magnetização em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|[[Arquivo: desvio_mag_heatbath_q5678910.png|thumb|upright=4|none|alt=Alt text|Susceptibilidade magnética em função da temperatura para Q = {5,6,7,8,9,10} e L = 64|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Comparação entre algoritmo de Metropolis-Hasting e banho térmico para baixas temperaturas ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 2 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q2_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 2, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 3 e T = 0.25 e T = 0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.25.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.25|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q3_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 3, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Algoritmo de Metropolis (azul) X Algoritmo de banho térmico para Q = 4 e T = 0.3 e T = 0.4&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.3.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.3|500px]]&lt;br /&gt;
|[[Arquivo: energia_metropolis_x_heathbath_Q4_T0.4.png|thumb|upright=4|none|alt=Alt text|Energia função dos passos de Monte Carlo para Q = 4, L = 64 e T = 0.4|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== .... ===&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a outra e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações acabam passando por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as duas faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4989</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4989"/>
		<updated>2021-05-24T20:46:05Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{i,j}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q = [2, 10]&amp;lt;/math&amp;gt;, variando de 1 em 1. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Energia total do sistema no estado estacionário com o algoritmo de banho térmico e algoritmo de Metropolis.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Algoritmo de Metropolis com &amp;lt;math&amp;gt;10^5&amp;lt;/math&amp;gt; MCS de transiente e &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS de amostragem.|500px]]&lt;br /&gt;
|[[Arquivo:|thumb|upright=4|none|alt=Alt text|Energia total do estado estacionário com o algoritmo de banho térmico com &amp;lt;math&amp;gt;10^5&amp;lt;/math&amp;gt; MCS de transiente e &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS de amostragem. Para pontos próximos de &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q &amp;lt; 8&amp;lt;/math&amp;gt; foram executados &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS de transiente.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:|thumb|upright=4|none|alt=Alt text||500px]]&lt;br /&gt;
|[[Arquivo:|thumb|upright=4|none|alt=Alt text||500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a outra e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações acabam passando por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as duas faixas causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4984</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4984"/>
		<updated>2021-05-24T20:41:19Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{i,j}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q = [2, 10]&amp;lt;/math&amp;gt;, variando de 1 em 1. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Energia total do sistema no estado estacionário com o algoritmo de banho térmico e algoritmo de Metropolis.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Algoritmo de Metropolis com &amp;lt;math&amp;gt;10^5&amp;lt;/math&amp;gt; MCS de transiente e &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS de amostragem.|500px]]&lt;br /&gt;
|[[Arquivo:|thumb|upright=4|none|alt=Alt text|Energia total do estado estacionário com o algoritmo de banho térmico com &amp;lt;math&amp;gt;10^5&amp;lt;/math&amp;gt; MCS de transiente e &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS de amostragem. Para pontos próximos de &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q &amp;lt; 8&amp;lt;/math&amp;gt; foram executados &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS de transiente.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:|thumb|upright=4|none|alt=Alt text||500px]]&lt;br /&gt;
|[[Arquivo:|thumb|upright=4|none|alt=Alt text||500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque por algum motivo o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a outra e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações acabam passando por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as duas faixas estão causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|center|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Histograma_HB_Q5_T07.png&amp;diff=4982</id>
		<title>Arquivo:Histograma HB Q5 T07.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Histograma_HB_Q5_T07.png&amp;diff=4982"/>
		<updated>2021-05-24T20:33:54Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4981</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4981"/>
		<updated>2021-05-24T20:33:21Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{i,j}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q = [2, 10]&amp;lt;/math&amp;gt;, variando de 1 em 1. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Energia total do sistema no estado estacionário com o algoritmo de banho térmico e algoritmo de Metropolis.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Algoritmo de Metropolis com &amp;lt;math&amp;gt;10^5&amp;lt;/math&amp;gt; MCS de transiente e &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS de amostragem.|500px]]&lt;br /&gt;
|[[Arquivo:|thumb|upright=4|none|alt=Alt text|Energia total do estado estacionário com o algoritmo de banho térmico com &amp;lt;math&amp;gt;10^5&amp;lt;/math&amp;gt; MCS de transiente e &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS de amostragem. Para pontos próximos de &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q &amp;lt; 8&amp;lt;/math&amp;gt; foram executados &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS de transiente.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:|thumb|upright=4|none|alt=Alt text||500px]]&lt;br /&gt;
|[[Arquivo:|thumb|upright=4|none|alt=Alt text||500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aqui é importante ressaltar que tivemos que mudar a quantidade de passos de Monte Carlo para algumas das simulações para que o sistema alcançasse o estado estcionário com o algoritmo de banho térmico. Isso porque por algum motivo o algoritmo de banho térmico favorece a formação de faixas dominadas por dois ou mais &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, o que faz com que o sistema demore muito até que uma dessas faixas consiga alinhar a outra e então levar o sistema para o estado estacionário.&lt;br /&gt;
Quando as simulações acabam passando por esses casos, observamos uma distribuição de energia com duas curvas normais: uma para o estado transiente do sistema em que as duas faixas estão causam um equilíbrio instável para o sistema e outra de menor energia que representa o estado de equilíbrio do sistema após uma das faixas alinhar a outra. Veja:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: histograma_HB_Q5_T07.png|thumb|upright=4|none|alt=Alt text| Histograma para &amp;lt;math&amp;gt; Q = 5&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; executado com o algoritmo de banho térmico mostrando a formação de duas curvas normais.|500px]]&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4969</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4969"/>
		<updated>2021-05-24T20:19:29Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt; de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1&amp;lt;/math&amp;gt;. Uma breve observação: o modelo de Potts de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-estados generalizado não exige que &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; seja um valor inteiro, mas neste trabalho só tratamos desse caso.&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{i,j}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou do Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Foram executadas simulações do modelo de Potts com &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e com &amp;lt;math&amp;gt;Q = [2, 10]&amp;lt;/math&amp;gt;, variando de 1 em 1. Foram feitas medidas das &amp;quot;magnetizações&amp;quot; do sistema e da energia total. A ideia de magnetização só tem sentido direto quando &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; (mesmo caso do modelo de Ising), mas para &amp;lt;math&amp;gt;Q &amp;gt; 2&amp;lt;/math&amp;gt; a magnetização indica apenas para qual direção o sistema está mais alinhado. Abaixo seguem gráficos das energias totais do sistema com o algoritmo de banho térmico e o algoritmo de Metropolis.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Energia total do sistema no estado estacionário com o algoritmo de banho térmico e algoritmo de Metropolis.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo: energia_metropolis_q234.png|thumb|upright=4|none|alt=Alt text|Algoritmo de Metropolis com &amp;lt;math&amp;gt;10^5&amp;lt;/math&amp;gt; MCS de transiente e &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS de amostragem.|500px]]&lt;br /&gt;
|[[Arquivo:|thumb|upright=4|none|alt=Alt text|Energia total do estado estacionário com o algoritmo de banho térmico com &amp;lt;math&amp;gt;10^5&amp;lt;/math&amp;gt; MCS de transiente e &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS de amostragem. Para pontos próximos de &amp;lt;math&amp;gt;T = 0.7&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;Q &amp;lt; 8&amp;lt;/math&amp;gt; foram executados &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS de transiente.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:|thumb|upright=4|none|alt=Alt text||500px]]&lt;br /&gt;
|[[Arquivo:|thumb|upright=4|none|alt=Alt text||500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4963</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4963"/>
		<updated>2021-05-24T19:46:47Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name = WU&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref name = WU&amp;gt;&amp;lt;/ref&amp;gt;(Lubensky, 1978) de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1. &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{i,j}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Aplicação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de  tentar realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4962</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4962"/>
		<updated>2021-05-24T19:43:57Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref name=wu&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização &amp;lt;ref&amp;gt;wu&amp;lt;/ref&amp;gt;(Lubensky, 1978) de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1. &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{i,j}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Aplicação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de  tentar realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4959</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4959"/>
		<updated>2021-05-24T19:40:52Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \qquad \text{se } s_i = s_j \\&lt;br /&gt;
  \frac{J}{2}, \qquad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
Por muitos anos o modelo de Potts foi considerado um sistema que exibe transição de ordem e desordem de interesse apenas teórico, mas atualmente se sabe que as propriedades do modelo de Potts podem ser encontradas em sistemas reais e podem ser medidos através da realização de experimentos.&lt;br /&gt;
O princípio básico na experimentação de sistemas de spin é o princípio da universalidade, onde busca-se identificar sistemas reais que pertencem a mesma classe de universalidade do modelo de spin em questão. Ou seja, medindo os expoentes críticos do experimento, encontramos sua classe.&lt;br /&gt;
&lt;br /&gt;
Para &amp;lt;math&amp;gt; Q = 2 &amp;lt;/math&amp;gt; sabemos que o modelo de Potts possui as propriedades do modelo de Ising. Em duas dimensões, foi provado &amp;lt;ref&amp;gt;F. Y. Wu, The Potts Model, Rev. Mod. Phys. 54, 235, 1982&amp;lt;/ref&amp;gt; que um sistema absorvido de átomos de &amp;lt;math&amp;gt;He^{4}&amp;lt;/math&amp;gt; cobrindo &amp;lt;math&amp;gt;\frac{1}{2}&amp;lt;/math&amp;gt; de uma rede honeycomb de grafite exibe o mesmo expoente crítico do calor específico que o modelo de Ising. Esse mesmo sistema, mas agora cobrindo &amp;lt;math&amp;gt;\frac{1}{3}&amp;lt;/math&amp;gt; da rede exibe o comportamento do modelo de Potts para &amp;lt;math&amp;gt; Q = 3 &amp;lt;/math&amp;gt;. Outros estudos de sistemas absorvidos, como &amp;lt;math&amp;gt;N_{2}&amp;lt;/math&amp;gt; em uma rede 2D de grafite, mostram mostram comportamento da classe &amp;lt;math&amp;gt;Q = 4&amp;lt;/math&amp;gt;. Também foi provado que polímeros que interagem em soluções, como processos de vulcanização (Lubensky, 1978) de polímeros ramificados tem a classe de universalidade para o modelo de Potts com &amp;lt;math&amp;gt; 0 \leq Q \leq 1. &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modelo celular de Potts ===&lt;br /&gt;
&lt;br /&gt;
Além da física de materiais, o modelo de Potts também é aplicado em biologia computacional para a simulação de células através do modelo celular de Potts. Esse modelo trata células como objetos deformáveis que podem mover, crescer ou até se dividir e pode simular o comportamento coletivo de células, estudando o surgimento de células cancerígenas e morfogênese. &lt;br /&gt;
&lt;br /&gt;
A energia do sistema é descrita por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathcal{H} = -\sum_{i,j}J_{\sigma_i,\sigma_j}\left(1-\delta_{\sigma_i,\sigma_j}\right) + \lambda\sum_{\sigma_i}\left(v(\sigma_i)-V(\sigma_i)\right)^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; são posições da rede, &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; é a célula na posição &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é o coeficiente determinando a adesão de dois tipos diferentes de células, &amp;lt;math&amp;gt;v(\sigma)&amp;lt;/math&amp;gt; é o volume da célula &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V(\sigma)&amp;lt;/math&amp;gt; é o volume padrão de &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; determina a força da elasticidade volumétrica da célula. O modelo pode considerar ainda elasticidade de área e perímetro de cada célula.&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Aplicação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de  tentar realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4454</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4454"/>
		<updated>2021-05-17T17:30:24Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \quad \text{se } s_i = s_j \\&lt;br /&gt;
 \frac{J}{2}, \quad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  ,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Aplicação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou Banho Térmico. Definimos Passo de Monte Carlo (MCS) como cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de  tentar realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L*L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório para identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos as seguintes relações que determinam a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. A maneira mais direta de se pensar em simular essa parte do sistema é utilizando condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde a função recebe o sitio. Utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa irá, a cada &amp;lt;math&amp;gt;10 mcs&amp;lt;/math&amp;gt;, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para simulações de Monte Carlo estejam no mesmo diretório no momento da compilação. Execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa demora mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;) caso se queira observar a simulação inteira.&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4453</id>
		<title>Modelo de Potts 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_Potts_2D&amp;diff=4453"/>
		<updated>2021-05-17T17:12:09Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modelo de Potts ==&lt;br /&gt;
=== O Modelo ===&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;modelo de Potts de Q-estados&amp;quot; trata de um sistema de rede com N spins interagentes &amp;lt;math&amp;gt;s=\{s_1,s_2,..s_i,...s_N\}&amp;lt;/math&amp;gt;, onde um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; pode assumir valores discretos &amp;lt;math&amp;gt;q \in{\{0, 1, 2, ..., Q-2, Q, Q-1\}}&amp;lt;/math&amp;gt;. Cada spin do sistema está limitado a interagir com outros spins em sua vizinhança e a energia da interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; é dada pelo potencial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V(s_i,s_j) = -J\delta{(s_i,s_j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\delta{(s_i,s_j)}&amp;lt;/math&amp;gt; é a função delta de Kronecker e &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; é a constante de interação entre os spins. Dessa maneira, a interação entre dois spins vizinhos contabiliza um valor &amp;lt;math&amp;gt;-J&amp;lt;/math&amp;gt; de energia ao sistema apenas se &amp;lt;math&amp;gt;s_i = s_j&amp;lt;/math&amp;gt;. A hamiltoniana do sistema é dada pela soma entre todas as interações entre spins vizinhos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}  = -J\sum_{\langle i,j \rangle}{\delta{(s_i,s_j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este modelo é tido como uma generalização natural do [https://fiscomp.if.ufrgs.br/index.php/Ising_2D Modelo de Ising] e para o caso &amp;lt;math&amp;gt;Q = 2&amp;lt;/math&amp;gt; ambos modelos são equivalentes a menos de uma constante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = \mathcal{H}_{potts} + \sum_{\langle i,j \rangle}\frac{J}{2} = -\frac{J}{2}\sum_{\langle i,j \rangle}[2\delta(s_i,s_j) - 1] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nesse caso, a interação entre dois spins &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;s_j&amp;lt;/math&amp;gt; assume a mesma dinâmica do modelo de Ising a contribuição para a energia do sistema será&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; V(s_i,s_j) = \begin{cases}&lt;br /&gt;
 -\frac{J}{2}, \quad \text{se } s_i = s_j \\&lt;br /&gt;
 \frac{J}{2}, \quad \text{se } s_i \neq s_j&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motivações ===&lt;br /&gt;
&lt;br /&gt;
== Método de Monte Carlo ==&lt;br /&gt;
O método de Monte Carlo é aplicado ao modelo de Potts com o objetivo de gerar estados de equilíbrio para medir os observáveis do sistema. Os &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; spins são iniciados com valores aleatórios de Q na rede e o método de Monte Carlo escolhe arbitrariamente um spin &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; e gera um novo valor de &amp;lt;math&amp;gt;q\in Q | q \neq s_i&amp;lt;/math&amp;gt; para o spin. A partir disso, através de algum algoritmo específico, se escolhe como os estados serão gerados e quais serão aceitos ou não para o sistema transicionar, respeitando as condições de balanço detalhado e ergodicidade das cadeias markovianas. Para este trabalho, foram estudados os algoritmos de Metropolis-Hasting e o algoritmo de banho térmico.&lt;br /&gt;
=== Algorítmo de Metropolis-Hasting ===&lt;br /&gt;
O primeiro algoritmo utilizado para gerar as configurações do sistema foi o algoritmo de Metropolis-Hasting. O algoritmo escolhe repetidamente um novo estado para o sistema &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e aceitando ou rejeitando ele de acordo com uma probabilidade de aceitação &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; de transitar de um estado antigo &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o novo estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. O algoritmo que iremos descrever utiliza a dinâmica de inversão única de spins.&lt;br /&gt;
&lt;br /&gt;
Temos que a condição de balanceamento detalhado é dada por &amp;lt;ref&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = e^{-\beta \Delta E}, \qquad (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;\Delta E = E_\nu - E_\mu&amp;lt;/math&amp;gt; é a diferença de energia entre o novo e o antigo estado.&lt;br /&gt;
&lt;br /&gt;
Vamos supor que tenhamos os estados &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e que temos a relação de energias: &amp;lt;math&amp;gt;E_\mu &amp;lt; E_\nu&amp;lt;/math&amp;gt;. Então, a maior das duas chances de aceitação é &amp;lt;math&amp;gt;A(\nu \rightarrow \mu)&amp;lt;/math&amp;gt;, portanto iremos igualar essa probabilidade a 1. &lt;br /&gt;
Para que &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; seja respeitada, iremos definir o valor de &amp;lt;math&amp;gt;A(\mu \rightarrow \nu)&amp;lt;/math&amp;gt; como &amp;lt;math&amp;gt;e^{-\beta \Delta E}&amp;lt;/math&amp;gt;. Temos, assim, o algoritmo de Metropolis-Hasting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \begin{cases}&lt;br /&gt;
e^{-\beta \Delta E}, \qquad \text{se } \Delta E &amp;gt; 0\\\\&lt;br /&gt;
1, \qquad \qquad \text{caso contrario}.&lt;br /&gt;
\end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dessa forma, sempre que tivermos um estado cuja energia seja menor do que a do estado atual, iremos aceitar a transição, mas se a energia for maior, teremos uma pequena probabilidade de trocarmos de estado.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Banho Térmico ===&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis-Hasting para inversão única de spins é eficaz para o modelo de Potts em baixos valores de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou temperaturas acima da temperatura crítica, entretanto para valores altos de &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; ou baixas temperaturas o algoritmo falha em convergir o sistema rapidamente para o estado estacionário.&lt;br /&gt;
&lt;br /&gt;
Considerando um caso onde &amp;lt;math&amp;gt;Q = 100&amp;lt;/math&amp;gt; e um spin que possui 4 vizinhos, se todos os vizinhos do spin possuem valores diferentes uns do outro e do próprio spin, poderá levar em média &amp;lt;math&amp;gt;100/4 = 25&amp;lt;/math&amp;gt; passos de Monte Carlo para sortear um novo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; que tem a transição aceita, e dessa forma o algoritmo irá demorar mais tempo para alcançar a configuração de equilíbrio do sistema. A dificuldade de aceitar transições é maior ainda para baixas temperaturas, onde a probabilidade de transicionar para um novo estado tem um peso maior para qualquer &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; diferente dos spins da vizinhança, dessa maneira poderá demorar 96 passos para gerar um spin que seja igual a algum spin da vizinhança e realizar a transição. Para contornar este problema podemos utilizar o algoritmo de banho térmico.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de banho térmico, assim como o metropolis, é um algoritmo em que mudamos um spin por vez. O algoritmo segue as seguintes etapas: primeiro escolhemos um spin na rede (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;), e independente do seu valor atual, escolhemos um novo valor para &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Esse novo valor será aceito, ou não, de acordo com os pesos de Boltzmann. Temos que no algoritmo de Banho Térmico nós atribuímos um valor &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, entre 1 e &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, ao spin com uma probabilidade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; é a energia do sistema quando &amp;lt;math&amp;gt;s_i = n&amp;lt;/math&amp;gt; e o somatório é dado em todas energias possíveis. Pelo fato desse algoritmo permitir que o spin assuma qualquer valor ele satisfaz a condição de ergodicidade. Temos que &amp;lt;math&amp;gt;A(\mu \rightarrow \nu) = a_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;A(\nu \rightarrow \mu) = a_{\mu}&amp;lt;/math&amp;gt;, assim, pela descrição do algoritmo temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{A(\mu \rightarrow \nu)}{A(\nu \rightarrow \mu)} = \frac{a_{\nu}}{a_{\mu}} = \frac{e^{-\beta E_{\nu}}}{\sum_{m=1}^q e^{-\beta E_m}}  \times \frac{\sum_{m=1}^q e^{-\beta E_m}}{e^{-\beta E_{\mu}}} = e^{-\beta \Delta E}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, o algoritmo de banho térmico respeita a condição de balanço detalhado. &lt;br /&gt;
&lt;br /&gt;
Veremos que para valores pequenos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; (como &amp;lt;math&amp;gt;q = 2&amp;lt;/math&amp;gt;, que é o modelo de Ising), o algoritmo de Metropolis é mais eficiente. Porém, para valores altos de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ou altas temperaturas o algoritmo de banho térmico é mais eficiente.&lt;br /&gt;
&lt;br /&gt;
=== Aplicação ===&lt;br /&gt;
&lt;br /&gt;
Neste trabalho, o modelo de Potts foi estudado em uma rede quadrada 2D com vizinhança de von Neumann para primeiros vizinhos e condições de contorno periódicas. A quantidade de spins no modelo é &amp;lt;math&amp;gt;N = L\times L&amp;lt;/math&amp;gt; com interações ferromagnéticas e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt;, favorecendo vizinhanças de spins que compartilham o mesmo valor de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; para minimizar a energia do sistema. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações do algoritmo de aceitação do Metropolis ou Banho Térmico. Definimos Passo de Monte Carlo (MCS) cada um desses passos temporais. Em cada passo de Monte Carlo, todos os sítios tem a probabilidade de  tentar realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Otimizações Computacionais ==&lt;br /&gt;
Essa seção é focada em algumas otimizações computacionais que podemos fazer ao simular sistemas de rede. Os &amp;quot;snippets&amp;quot; de códigos estão em C, mas a ideia pode ser adaptada para qualquer linguagem de programação. &lt;br /&gt;
&lt;br /&gt;
=== Redes === &lt;br /&gt;
Uma boa sugestão ao criar a topologia do sistema é utilizar um &amp;quot;array&amp;quot; unidimensional ao invés de bidimensional. Como estamos falando de uma rede quadrada de tamanho &amp;lt;math&amp;gt;L \times L = L^2&amp;lt;/math&amp;gt; podemos fazer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[L*L]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
no lugar de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int sitio[L][L];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uma praticidade que ganhamos com isso é que diminuímos as componentes que precisamos utilizar para diferenciar cada sítio na rede, sendo necessário apenas um número aleatório identificar o sítio. Outra sugestão é criar uma matriz de vizinhos, pois nas simulações desses sistemas geralmente precisamos saber a configuração deles. Nos vizinhos criaremos um &amp;quot;array&amp;quot; bidimensional, uma coordenada indicará o sitio que queremos e a outra indicará qual dos quatro vizinhos estamos lidando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
int viz[L*L][4];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Então por lidarmos com os nossos sítios em um &amp;quot;array&amp;quot; unidimensional e condições periódicas utilizamos de fórmulas que guardarão a posição de cada vizinho nessa matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;L*L; i++)&lt;br /&gt;
{&lt;br /&gt;
        viz[i][0] = (i-L+(L*L))%(L*L);&lt;br /&gt;
        viz[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
        viz[i][2] = (i+L)%(L*L);&lt;br /&gt;
        viz[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se necessitarmos comparar com apenas um vizinho utilizamos o numero correspondente a ele, e se precisarmos comparar com todos podemos fazer um &amp;quot;loop&amp;quot;. Lembrando que esse &amp;quot;array&amp;quot; guarda a posição dos vizinhos, se quisermos, por exemplo, associar um valor &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; ao vizinho 3 do sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; fazemos da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
sitio[viz[i][3]] = q;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Redução de &amp;quot;if&amp;quot;s ===&lt;br /&gt;
&lt;br /&gt;
No Modelo de Potts nós possuímos uma delta de Kronecker. Iremos subtrair &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; da nossa energia se o valor do sítio for igual ao de um vizinho. O jeito mais lógico de se pensar em simular essa parte do sistema é utilizando de condicionais &amp;quot;if/else&amp;quot;, da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(int j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        for(int k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1 = 0;&lt;br /&gt;
                if(j==spin[neigh[site][k]])&lt;br /&gt;
                {&lt;br /&gt;
                        E1-=J;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
                 E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto, Para valores grandes de &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; esses condicionais &amp;quot;if&amp;quot;s resultarão em um alto custo computacional. Como temos uma delta de Kronecker no sistema podemos utilizar dela dentro do programa. Primeiro definimos o array bidimensional como a delta de kronecker da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;_Q; i++)&lt;br /&gt;
{&lt;br /&gt;
        for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
        {&lt;br /&gt;
                if(i==j)&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 1;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                        kronecker[i][j] = 0;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizamos &amp;quot;if/else&amp;quot;, porém essa parte do código executa apenas uma vez. E então usamos esse &amp;quot;array&amp;quot; para otimizar as comparações:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
for(j=0; j&amp;lt;_Q; j++)&lt;br /&gt;
{&lt;br /&gt;
        E1 = 0;&lt;br /&gt;
&lt;br /&gt;
        for(k=0; k&amp;lt;4; k++)&lt;br /&gt;
        {&lt;br /&gt;
                E1-=J*kronecker[j][spin[neigh[site][k]]];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        E2 += exp(-E1/(KB*_TEMP));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos um melhor desempenho computacional, já que não temos uma grande quantidade de &amp;quot;if&amp;quot;&amp;quot; no código. Também utilizamos de uma forma mais clara a delta de kronecker do nosso hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
=== Função de Visualização ===&lt;br /&gt;
&lt;br /&gt;
Podemos estar interessados em ver a evolução do nosso sistema. Podemos plotar diretamente do programa sem gerar os dados e plotar depois. Definimos essa função da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
void visualize(int *spin)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;,L-1,L-1);&lt;br /&gt;
        printf(&amp;quot;pl &#039;-&#039; matrix w image\n&amp;quot;);&lt;br /&gt;
        for(i=L2-1; i&amp;gt;=0; i--)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;%d &amp;quot;, spin[i]);&lt;br /&gt;
                if(i%L == 0)&lt;br /&gt;
                {&lt;br /&gt;
                        printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;e\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde a função recebe o sitio utilizando um &amp;quot;pipe&amp;quot; redirecionamos a saida diretamente para a o gnuplot. Podemos também não querer plotar sempre, assim definimos uma diretiva que responde a compilação do programa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#ifdef VIEW     &lt;br /&gt;
        if(mcs % 10 == 0)&lt;br /&gt;
        {&lt;br /&gt;
                printf(&amp;quot;set title &#039;T = %d MCS&#039;\n&amp;quot;, mcs);&lt;br /&gt;
                visualize(spin);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, se na linha de compilação tiver a opção &amp;lt;source lang=sh&amp;gt; -DVIEW &amp;lt;/source&amp;gt; o programa ira, a cada 10mcs, plotar a configuração do sistema. Essa opção as vezes se torna importante para visualizar se nosso sistema esta evoluindo da forma que estamos esperando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. É necessário que o programa e a biblioteca com funções para MC estejam na mesma pasta no momento da compilação. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é o estado Q do sistema e o terceiro é a temperatura do sistema. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DVIEW prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out Q TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
O script possui alguns exemplos de execução através de diferentes estados e temperaturas do sistema. Copie o conteudo em um arquivo e então o deixar executável:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ chmod +x script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então com o programa compilado pode executar da forma&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./script.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Potts Metropolis]]&lt;br /&gt;
&lt;br /&gt;
[[Potts Banho Térmico]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
[[Script em bash para gerar os dados]]&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Gas.gif&amp;diff=3119</id>
		<title>Arquivo:Gas.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Gas.gif&amp;diff=3119"/>
		<updated>2020-11-27T08:50:31Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: Joaomesquita enviou uma nova versão de &amp;amp;quot;Arquivo:Gas.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Gas.gif&amp;diff=3118</id>
		<title>Arquivo:Gas.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Gas.gif&amp;diff=3118"/>
		<updated>2020-11-27T08:48:31Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3117</id>
		<title>Gás de Rede 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3117"/>
		<updated>2020-11-27T08:42:28Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &lt;br /&gt;
Este trabalho tem o intuito de apresentar uma descrição do modelo do Gás de Rede bidimensional e traçar paralelos com o modelo de Ising, discutindo a relação entre seus Hamiltonianos.&lt;br /&gt;
&lt;br /&gt;
== Gás de Rede ==&lt;br /&gt;
&lt;br /&gt;
O Modelo do Gás de Rede 2D consiste em um sistema de &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas da forma &amp;lt;math&amp;gt;\sigma = {\sigma_1, \sigma_1, \dotsc, \sigma_N}&amp;lt;/math&amp;gt; onde cada sítio da rede pode assumir o valor &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, ocupado por uma partícula, ou &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;, não ocupado por uma partícula. A energia total do sistema é dada pelo Hamiltoniano do Gás de Rede, descrito pela equação&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \epsilon \sum_{\langle i,j \rangle} \sigma_i \sigma_j \qquad (1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde o somatório é dado entre os quatro vizinhos mais próximos e &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; é a constante de interação entre as partículas, para &amp;lt;math&amp;gt;\epsilon \geq 0&amp;lt;/math&amp;gt; a interação é atrativa. Por se tratar de uma rede quadrada com &amp;lt;math&amp;gt;L^2 = L \times L&amp;lt;/math&amp;gt; sítios, apenas uma parcela da rede é ocupada por partículas, ou seja, possuímos uma densidade constante &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; de partículas. Podemos expressar a condição da densidade constante da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} \sigma_i = \rho L^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazendo uma mudança de variáveis da forma &amp;lt;math&amp;gt;s_i = 2 \sigma_i - 1&amp;lt;/math&amp;gt; saímos da situação de ocupação e não ocupação de sítios e obtemos variáveis do Modelo de Ising &amp;lt;ref name=ISING&amp;gt; https://fiscomp.if.ufrgs.br/index.php/Ising_2D&amp;lt;/ref&amp;gt;, spins Up e Down. A variável &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; assume valor &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; (up) quando o sítio esta ocupado por uma partícula e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; quando não está. Aplicando a mudança de variáveis no Hamiltoniano do Gás de Rede obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} (s_i + 1)(s_j + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}[s_i s_j + s_i + s_j + 1]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Abrindo os termos dos três últimos somatórios se encontra que&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle}s_i = \sum_{\langle i,j \rangle}s_j = z \sum_{i}s_i&amp;lt;/math&amp;gt;, e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle} 1 = z L^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
o que simplifica a expressão para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{2} \epsilon z \sum_{i} s_i - \frac{1}{4} \epsilon z L^2 \qquad (2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; é o número de coordenação, isto é, o número de vizinhos de cada sítio, que para a rede quadrada é 4. Note a mudança no índice do somatório de &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Vemos que este Hamiltoniano possui a forma do Hamiltoniano do modelo de Ising com aplicação de um campo magnético externo, a menos de uma constante. Entretanto, com a densidade constante, fazendo a mesma mudança de variáveis, obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} s_i = (2\rho - 1) L^2 \qquad (3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicando essa relação no Hamiltoniano obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} s_i s_j - z \epsilon L^2 \rho  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; são constantes, o segundo termo é constante. Definindo &amp;lt;math&amp;gt;J = \epsilon / 4&amp;lt;/math&amp;gt; o Hamiltoniano se torna&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - J \sum_{\langle i,j \rangle} s_i s_j + \text{constante}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A constante não influencia nos valores da medida, pois ela se cancela na equação de mudança de estado &amp;lt;ref name=BARKEMA&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;. Vemos que, ao assumir a densidade constante, o modelo do Gás de Rede se torna o modelo de Ising sem a presença de um campo magnético. A condição da densidade constante é a magnetização total do modelo. &lt;br /&gt;
&lt;br /&gt;
É interessante notar que podemos tratar o modelo do gás de rede de duas formas: &#039;&#039;&#039;(a)&#039;&#039;&#039; assumir a densidade constante e utilizar o primeiro Hamiltoniano apresentado, ou &#039;&#039;&#039;(b)&#039;&#039;&#039; não assumir a densidade constante, aplicar a mudança de variáveis discutida e utilizar o Hamiltoniano que possuí a forma de Ising com campo magnético.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Método de Monte Carlo==&lt;br /&gt;
&lt;br /&gt;
===Princípios gerais===&lt;br /&gt;
&lt;br /&gt;
Para desenvolver a dinâmica do gás de rede, isto é, fazer com que ocorram alterações na posição das partículas, recorre-se ao método de Monte Carlo. Trata-se, em linhas gerais, de um método estatístico baseado em amostragem aleatória. É comum, ao introduzir-se o assunto, utilizar problemas de cálculo de áreas, como, por exemplo, a clássica história das crianças que desenharam, na areia, um círculo contido em um quadrado, de modo que o diâmetro do círculo seja igual ao lado do quadrado. Jogam, aleatoriamente, pedras no quadrado. Após uma grande quantidade de arremessos, compara-se o valor de pedras que estão dentro do círculo com o número total dentro do quadrado, fazendo a razão entre esses dois valores, encontra-se uma aproximação para a razão entre a área do círculo e a do quadrado, que equivale a &amp;lt;math&amp;gt;\pi/4&amp;lt;/math&amp;gt;. Desse modo, pode ser encontrada uma aproximação do valor de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; através do método de Monte Carlo, que simula uma aproximação experimental&amp;lt;ref name=KRAUTH&amp;gt;Krauth ,W. ,&amp;quot;Statistical Mechanics: Algorithms and Computations&amp;quot;. Oxford Master Series in Physics, Oxford University Press, 2006.&amp;lt;/ref&amp;gt;. É possível propor um novo modelo, no qual o quadrado é grande e as pedras são atiradas aleatoriamente de dentro do quadrado, de modo que a posição de arremesso é atualizada para a posição da última pedra jogada. A principal alteração nesse método é a possibilidade de que uma pedra seja atirada para fora do quadrado. Nesse caso, a posição para o próximo arremesso não muda e as pedras que foram parar fora das bordas do quadrado são empilhadas naquela posição. Essas mudanças no método caracterizam a aplicação de Monte Carlo em uma cadeia de Markov, definida de modo que a configuração do próximo estado depende somente da configuração atual. Até aqui, vimos o método de Monte Carlo aplicado em situações nas quais a probabilidade de um evento ocorrer na configuração subsequente do sistema é zero ou um. Para novas distribuições de probabilidade, utiliza-se o algoritmo de Metrópolis.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo de Metrópolis===&lt;br /&gt;
&lt;br /&gt;
Como mencionado, o método de Monte Carlo funciona através de atualizações em um sistema, fazendo com que ele passe de um estado para outro. Consideremos &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; como sendo o estado atual do sistema. O próximo estado será chamado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Chamamos a probabilidade do sistema passar do estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt;. A ideia do algoritmo de Metrópolis é aplicar essa probabilidade no método de Monte Carlo. Para isso, um método muito utilizado é calcular a probabilidade &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt; e compará-la a um número aleatório &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, de modo que &amp;lt;math&amp;gt;0&amp;lt;r&amp;lt;1&amp;lt;/math&amp;gt;. Se &amp;lt;math&amp;gt; p(\mu\to\nu)&amp;gt;r&amp;lt;/math&amp;gt;, então o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é adotado pelo sistema. Para aplicar essas ideias ao problema do gás de rede, o método mais simples é utilizando o algoritmo de Kawasaki, que faz com que dois sítios, selecionados aleatoriamente, tenham seus valores trocados. Isso implica que a magnetização do sistema será constante&amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;. Para calcular a probabilidade de aceitação dessa mudança, calcula-se a variação de energia entre os estados,&amp;lt;math&amp;gt;\Delta E= E_{\nu}-E_{\mu}&amp;lt;/math&amp;gt;, e aplica-se o valor obtido na equação de probabilidade de aceitação de Metrópolis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\mu\to\nu)=\left\{\begin{array}{rc} e^{\frac{-\Delta E}{k_BT}}, \quad \text{se}\quad \Delta E&amp;gt;0\\&lt;br /&gt;
1, \quad \text{caso contrario}\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, inicialmente foram feitas algumas alterações no algoritmo de Kawasaki. Limita-se a troca de valores somente entre um sítio e seus quatro vizinhos principais (isto é, acima, abaixo, à direita e à esquerda). Isso porque se tinha a intenção de recriar o comportamento difusivo de um gás no modelo do gás de rede em duas dimensões, porém, essa escolha para a dinâmica das simulações limita em muito a facilidade do sistema equilibrar, como será mostrado na parte de resultados. O algoritmo inicial consiste na seguinte ideia: No estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, seleciona-se aleatoriamente um sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. A partir dele, é sorteado um de seus vizinhos, digamos, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, com o qual haverá a troca de valor. Antes que ocorra a troca, são calculados os valores de dois Hamiltonianos: o que relaciona o sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; com seus vizinhos e o que relaciona &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; com seus vizinhos. Somados, eles representam o valor de &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt;. Após a troca, esses valores são recalculados, formando o valor de &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt;. Com esses valores, segue-se o cálculo da probabilidade da forma usual. &lt;br /&gt;
&lt;br /&gt;
Após verificar que a dinâmica inicialmente escolhida não era apropriada, optou-se por usar o algoritmo de Kawasaki tradicional, fazendo uso de uma listagem de quais eram os estados dos sítios e escolhendo os pares a serem trocados sempre como sítios de estados diferentes. Isso faz com que a aceitação do algoritmo de Monte Carlo seja muito mais elevada que ao do nosso algoritmo inicial, pois no caso em que grandes clusters são formados as trocas eram sempre rejeitadas de acordo com a dinâmica inicial.&lt;br /&gt;
&lt;br /&gt;
===Considerações práticas===&lt;br /&gt;
&lt;br /&gt;
Já consideramos os aspectos iniciais do método de Monte Carlo, mostrando suas aplicações. Vimos, do mesmo modo, a utilização do algoritmo de Metrópolis, dentro do qual aplicamos o algoritmo de Kawasaki (modificado) para desenvolver o sistema do gás de rede. Resta elucidar a função do parâmetro temporal, isto é, como as iterações desses algoritmos influenciam o sistema. Primeiramente, deve-se fixar um valor para o número de passos temporais que serão realizados. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações  do algoritmo de Metrópolis, abordado acima, sendo &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; o lado da rede quadrada. Chamamos de Passo de Monte Carlo (MCS) cada um desses passos temporais. Em outras palavras: em cada passo de Monte Carlo, todos os sítios tem a possibilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
=== Eficiência da dinâmica local ===&lt;br /&gt;
&lt;br /&gt;
Como mencionado acima, a primeira dinâmica escolhida foi a que restringe os sítios a trocarem de estado para apenas aqueles que são vizinhos próximos (os 4 acima, abaixo, a direita e a esquerda). Se verificou ao analisar os dados das simulações que na verdade essa dinâmica não era apropriada, pois a aceitação do algoritmo é muito baixa e com a amostragem escolhida (&amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS) o sistema ainda não estaria equilibrado. Isso pode ser percebido mais facilmente observando os histogramas das simulações. Sabe-se que a distribuição das grandezas macroscópicas de um sistema termodinâmico é a distribuição de Boltzmann &amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, então se espera para o sistema analisado que a energia tenha uma distribuição normal de frequências. Observe a diferença entre as distribuições para a energia do sistema no caso da dinâmica local inicialmente escolhida e no caso do algoritmo tradicional de Kawasaki:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Diferença entre distribuições para a energia do sistema por dinâmica escolhida.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Assim podemos notar que o sistema não está equilibrado após a amostragem com a dinâmica local. No caso do algoritmo tradicional o sistema se encontra em equilíbrio. Para temperaturas mais altas, acima da temperatura crítica para cada modelo onde não há mais separação de fase, a dinâmica tem eficiência satisfatória, pois a aceitação do algoritmo de Monte Carlo é maior já que sem a formação de grandes clusters a probabilidade de uma partícula ser selecionada e poder trocar para um sítio vazio que seja seu vizinho é muito maior. Contudo, ainda assim é mais vantajoso executar as simulações na linguagem de Ising, já que a aceitação do algoritmo ainda é maior do que para a dinâmica local proposta, então a quantidade de dados descorrelacionados para a mesma amostragem de &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS é maior. Dessa maneira, para uma amostragem de mesmo tamanho, o valor estimado para uma grandeza &amp;lt;math&amp;gt;\langle Q \rangle&amp;lt;/math&amp;gt; é mais preciso no caso da dinâmica proposta pelo algoritmo de Kawasaki, e para uma mesma precisão no valor estimado seria necessária uma amostragem menor do que a da dinâmica local.&lt;br /&gt;
A referência na qual esse trabalho mais se inspira, Monte Carlo Methods in Statistical Physics, de Newman e Barkema, não dá a devida ênfase para quão interessante computacionalmente é se manter na linguagem do modelo de Ising e adotar o algoritmo de Kawasaki.&lt;br /&gt;
É importante notar que as simulações da dinâmica de Kawasaki foram feitas na linguagem do modelo de Ising, com spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, ao invés de sítios ocupados por partículas &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; e sítios desocupados &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Essa mudança é importante para entender a mudança na escala das grandezas entre as simulações. Como a constante de interação &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; do modelo de Ising é um quarto da constante &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, a temperatura e a energia no modelo de Ising valem &amp;lt;math&amp;gt;\frac{1}{4}&amp;lt;/math&amp;gt; da temperatura e da energia nas simulações com a dinâmica local na linguagem do gás de rede.&lt;br /&gt;
&lt;br /&gt;
=== Separação de fases ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Animações ilustrando as duas fases acima e abaixo de &amp;lt;math&amp;gt;T_c = 0.56725&amp;lt;/math&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:sep_fases.gif|thumb|center|none|alt=Alt text|Separação de fases do sistema do gás de rede em fases de densidade alta e baixa. Note como ocorre a formação de clusters e estes tendem a se agrupar formando clusters ainda maiores.|480px]]&lt;br /&gt;
|[[Arquivo:gas.gif|thumb|center|none|alt=Alt text|Fase gasosa do modelo do gás de rede com densidade constante. Note como os clusters se agrupam e se desfazem rapidamente.|480px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Um dos aspectos interessantes do modelo do gás de rede é o fato de ser um modelo chamado de COP-Ising, ou Ising com parâmetro de ordem conservado. O fato de a densidade ser constante no modelo do gás de rede implica que o modelo de Ising análogo tem a magnetização constante (chamado de parâmetro de ordem). Abaixo da temperatura crítica &amp;lt;math&amp;gt;T_c = 0.56725&amp;lt;/math&amp;gt; o sistema se separa em duas fases com densidades diferentes, se acomodando na forma de clusters cada vez maiores conforme a temperatura diminui. Acima de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; o sistema assume uma forma &amp;quot;gasosa&amp;quot;, em que a formação de pequenos clusters é apenas momentânea e a densidade sobre a rede é aproximadamente homogênea.&lt;br /&gt;
&lt;br /&gt;
=== Energia e efeito do tamanho da rede ===&lt;br /&gt;
&lt;br /&gt;
A grandeza que foi medida nas simulações é a energia total do sistema. Para analisar os efeitos do tamanho da rede devemos comparar os valores das energias por número de sítios, já que quanto maior a rede maior o número de partículas e portanto maior o valor absoluto da energia. Abaixo temos um gráfico com os valores da energia total do sistema por número de sítios em função da temperatura, com os dados das três redes simuladas (L = 16, 32, 64).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:energia.png|thumb|center|none|alt=Alt text|Energia total do sistema dividida pelo número de sítios em função da temperatura para redes de tamanhos diferentes. Cada ponto no gráfico é a média de 5 amostragens com seu desvio padrão.|480px]]&lt;br /&gt;
&lt;br /&gt;
Aqui o comportamento da energia é como esperado para o modelo. Há uma queda no valor da energia conforme a temperatura do reservatório diminui abaixo da temperatura crítica, e conforme a temperatura aumenta acima da temperatura crítica, a energia aumenta mais devagar dado que é o estado em que o sistema está na sua fase amorfa.&lt;br /&gt;
&lt;br /&gt;
Algo que se nota no gráfico acima é a diferença nos valores da energia das redes &amp;lt;math&amp;gt;L = 32&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. É perceptível que as duas redes maiores apresentam valores de energia muito mais próximos. Isso se dá justamente pelo tamanho da rede e o fato da densidade ser a mesma.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Ilustração dos estados de menor energia&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:rede16.png|thumb|center|upright=4|none|alt= Alt text|Diagrama ilustrando o estado de menor energia para a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. As cores indicam o número de sítios vizinhos ocupados.|480px]]&lt;br /&gt;
|[[Arquivo:diagrama.gif|thumb|upright=4|none|alt=Alt text|Animação ilustrando o número de partículas internas ao cluster se tornando mais relevante que o número de partículas nas bordas conforme a rede aumenta.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Para entender como o valor da energia total do sistema por número de sítios varia com o tamanho da rede é interessante calcular essa grandeza no estado de menor energia. No caso da rede quadrada, o estado de menor energia é um cluster quadrado. Como ilustrado no diagrama acima, existem sítios com 3 vizinhos ocupados e sítios com 2 vizinhos ocupados. Estes são os da borda do cluster. Todos os outros internos ao cluster tem 4 vizinhos ocupados e portanto contribuem com &amp;lt;math&amp;gt;-4\epsilon&amp;lt;/math&amp;gt; para o Hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
Nesse trabalho adotamos &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt;, o que facilita o cálculo da energia total, pois o tamanho do lado do cluster é &amp;lt;math&amp;gt; l = \sqrt{\frac{L^2}{4}}&amp;lt;/math&amp;gt;. Temos &amp;lt;math&amp;gt;(l - 2)^2&amp;lt;/math&amp;gt; partículas internas ao cluster e portanto com 4 vizinhos e &amp;lt;math&amp;gt;4(l - 2)&amp;lt;/math&amp;gt; partículas nas bordas com 3 vizinhos. O Hamiltoniano é portanto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = (-2\epsilon)4 + (-3\epsilon)4(l - 2) + (-4\epsilon)(l - 2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O primeiro termo é a referente às interações dos 4 cantos do cluster, que tem apenas 2 vizinhos ocupados. Abrindo os termos e simplificando a equação chegamos ao valor do Hamiltoniano do estado de menor energia do gás de rede:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = -(L^2 - 2L)\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo por 2 para encontrar o valor da energia total e então por &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;e = \frac{E}{L^2} = - \frac{\epsilon}{2} + \frac{\epsilon}{L}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
que é a grandeza apresentada no gráfico anterior. Essa elaboração foi feita para o modelo do gás de rede, porém as simulações foram feitas com o modelo de Ising, com a restrição de que a magnetização era constante (a quantidade de spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é constante).&lt;br /&gt;
&lt;br /&gt;
Usando a equação &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;J = \frac{\epsilon}{4}&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J\sum{i}s_i - 4JL^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utilizamos então a equação &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt; e percebemos que os termos do meio e da direita se cancelam, deixando somente o primeiro termo para avaliarmos em termos do estado de menor energia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J(2\rho - 1)L^2 - 4JL^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; = -J\sum_{\langle i, j \rangle}s_i s_j &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora podemos avaliar o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições. Para isso podemos nos basear no diagrama usado anteriormente, com a ressalva de que os sítios imediatamente fora do cluster também interagem com ele, já que temos agora spins &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; ao invés de sítios vazios. Temos o mesmo número de spins internos ao cluster que de pariculas anteriormente, assim como para as bordas do cluster e os mesmos quatro cantos. Além disso, os sítios fora do cluster também tem contribuição para o Hamiltoniano. O número de spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;L^2 - \frac{L^2}{4} - 2L&amp;lt;/math&amp;gt; e o número de spins fora do cluster com 1 vizinho &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;2L&amp;lt;/math&amp;gt;. Agora podemos somar todas essas contribuições.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = (-4J)(L^2 - \frac{L^2}{4} - 2L) + (-2J)(2L) + (-2J)4(\frac{L}{2} - 2) + (-4J)(\frac{L}{2} - 2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da esquerda para a direita os termos são a contribuição dos spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, dos spins fora do cluster mas com um vizinho no cluster, dos spins na borda do cluster e dos spins interiores ao cluster. Abrindo os termos e simplificando a equação chegamos finalmente em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -(4L^2 - 8L)J&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E como nas simulações foram utilizadas que &amp;lt;math&amp;gt;\epsilon = 1&amp;lt;/math&amp;gt; para o caso do gás de rede e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt; para o modelo de Ising, temos portanto que as energias medidas com o modelo de Ising são equivalentes a 4 vezes as energias no modelo do gás de rede, como se verificou ao implementar a mesma função de medida para a linguagem de spins e de sítios vazios e ocupados. E com essa equação para o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições podemos perceber que o efeito do tamanho de rede é praticamente o mesmo, com a ressalva de que a energia por sítio deve ser também 4 vezes a energia por sítio do modelo do gás de rede.&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
&lt;br /&gt;
Passamos pelo que vem a ser o modelo do gás de rede na rede quadrada e apresentamos sua relação com o modelo de Ising. O Hamiltoniano do modelo do gás de rede nos mostra que ele é idêntico ao modelo de Ising com um termo de campo magnético externo. Ao fixarmos a densidade do modelo do gás de rede, impomos a restrição de que o modelo de Ising deve ter a magnetização constante para mantermos a equivalência. Também se discutiu o efeito do tamanho das redes simuladas e vimos que quanto maior o tamanho da rede mais próximo será o valor das energias por sítio em comparação com redes de tamanhos similares e vimos que isso se deve pelo fato do número de sítios no cluster do estado de menor energia crescer mais rápido no interior do cluster do que em seu perímetro.&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é a temperatura do banho térmico e o terceiro é a semente utilizada pelo gerador de números pseudo-aleatórios. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DGNU prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede com Densidade Constante e dinâmica local]]&lt;br /&gt;
&lt;br /&gt;
[[Modelo de ising com magnetização constante e algoritmo de Kawasaki]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Diagrama.gif&amp;diff=3116</id>
		<title>Arquivo:Diagrama.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Diagrama.gif&amp;diff=3116"/>
		<updated>2020-11-27T07:55:20Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: Joaomesquita enviou uma nova versão de &amp;amp;quot;Arquivo:Diagrama.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Biblioteca_com_fun%C3%A7%C3%B5es_em_C_para_simula%C3%A7%C3%B5es_de_Monte_Carlo&amp;diff=3115</id>
		<title>Biblioteca com funções em C para simulações de Monte Carlo</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Biblioteca_com_fun%C3%A7%C3%B5es_em_C_para_simula%C3%A7%C3%B5es_de_Monte_Carlo&amp;diff=3115"/>
		<updated>2020-11-27T07:43:49Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: Criou página com &amp;#039;&amp;lt;source lang = &amp;quot;c&amp;quot;&amp;gt; /******************************************************************** ***                       Monte Carlo Routines                    *** ***...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/********************************************************************&lt;br /&gt;
***                       Monte Carlo Routines                    ***&lt;br /&gt;
***                         V0.11 18/05/2000                      ***&lt;br /&gt;
***                                                               ***&lt;br /&gt;
***                                                               ***&lt;br /&gt;
********************************************************************/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;limits.h&amp;gt; &lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define MC_VERSION  &amp;quot;0.11&amp;quot;&lt;br /&gt;
#define FNORM   (2.3283064365e-10)&lt;br /&gt;
#define RANDOM  ( (ira[ip++]=ira[ip1++]+ira[ip2++]) ^ira[ip3++] )        &lt;br /&gt;
#define FRANDOM (FNORM * RANDOM)&lt;br /&gt;
&lt;br /&gt;
/********************************************************************&lt;br /&gt;
***                      Variable Declarations                    ***&lt;br /&gt;
********************************************************************/&lt;br /&gt;
&lt;br /&gt;
unsigned long randomize, seed;                    /* Random number */&lt;br /&gt;
static clock_t   begin_cpu_time;                 /* Time variables */&lt;br /&gt;
static time_t    begin_real_time;&lt;br /&gt;
unsigned zseed, ira[256];&lt;br /&gt;
unsigned char ip,ip1,ip2,ip3;&lt;br /&gt;
&lt;br /&gt;
/********************************************************************&lt;br /&gt;
*            Random Number Generator by Parisi &amp;amp; Rapuano            *&lt;br /&gt;
*                  Last Modified: 18/05/2000                        *&lt;br /&gt;
*                                                                   *&lt;br /&gt;
*  First, the function start_randomic() should be called to create  *&lt;br /&gt;
*  the seed (odd number):                                           *&lt;br /&gt;
*                 seed = start_randomic();                          *&lt;br /&gt;
*                                                                   *&lt;br /&gt;
*  Return: start_randomic -&amp;gt; unsigned long int                      *&lt;br /&gt;
*          FRANDOM -&amp;gt; double in [0,1)                               *&lt;br /&gt;
********************************************************************/&lt;br /&gt;
unsigned rand4init(void)&lt;br /&gt;
{&lt;br /&gt;
     unsigned long long y;&lt;br /&gt;
   &lt;br /&gt;
     y = (zseed*16807LL);&lt;br /&gt;
     zseed = (y&amp;amp;0x7fffffff) + (y&amp;gt;&amp;gt;31);&lt;br /&gt;
     if (zseed&amp;amp;0x80000000)&lt;br /&gt;
         zseed = (zseed&amp;amp;0x7fffffff) + 1;&lt;br /&gt;
     return zseed;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Init_Random(void)&lt;br /&gt;
{&lt;br /&gt;
     int i;&lt;br /&gt;
   &lt;br /&gt;
     ip=128;&lt;br /&gt;
     ip1=ip-24;&lt;br /&gt;
     ip2=ip-55;&lt;br /&gt;
     ip3=ip-61;&lt;br /&gt;
   &lt;br /&gt;
     for (i=ip3; i&amp;lt;ip; i++)&lt;br /&gt;
         ira[i] = rand4init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
*                          Random Seed                          *&lt;br /&gt;
*                  Last Modified: 18/05/2000                    *&lt;br /&gt;
*                                                               *&lt;br /&gt;
* When debugging, use always the same seed, otherwise, take it  *&lt;br /&gt;
* as the numbers of seconds ellapsed since ?/?/1970.            *&lt;br /&gt;
****************************************************************/ &lt;br /&gt;
unsigned long start_randomic(void)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  unsigned long semente;&lt;br /&gt;
   &lt;br /&gt;
  semente = (unsigned long) time(NULL);&lt;br /&gt;
  if (semente%2==0) ++semente; /*odd number*/ /* random seed */&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
  semente = 1206544417 /* 1189007899 */ /*2067511789*//*2067512563*//*1852686583*/;&lt;br /&gt;
#endif&lt;br /&gt;
  zseed = semente;&lt;br /&gt;
  Init_Random();&lt;br /&gt;
  return semente;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************&lt;br /&gt;
*                          Random Seed                          *&lt;br /&gt;
*                  Last Modified: 01/04/2008                    *&lt;br /&gt;
*                                                               *&lt;br /&gt;
* When debugging, use always the same seed, otherwise, take it  *&lt;br /&gt;
* as the numbers of seconds ellapsed since ?/?/1970.            *&lt;br /&gt;
****************************************************************/ &lt;br /&gt;
void start_randomic_parallel(unsigned long semente)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  zseed = semente;&lt;br /&gt;
  Init_Random();&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************&lt;br /&gt;
***                          2D Neighbours                     ***&lt;br /&gt;
***                    Last Modified: 24/01/1999               ***&lt;br /&gt;
***                                                            ***&lt;br /&gt;
***  In a 2D, with periodic boundary conditions, create the    ***&lt;br /&gt;
***  matrixes with the neighbours of all sites.                ***&lt;br /&gt;
***                                                            ***&lt;br /&gt;
***  Input: right,left,up &amp;amp; down -&amp;gt; matrixes with neighb. sites***&lt;br /&gt;
***         l_size -&amp;gt; linear dimension (l_size x l_size)       ***&lt;br /&gt;
***                                                            ***&lt;br /&gt;
**   From right to left, top to bottom, front to back.         ***&lt;br /&gt;
*****************************************************************/&lt;br /&gt;
void neighbours_2d(unsigned long *right,unsigned long *left,&lt;br /&gt;
		   unsigned long *up, unsigned long *down,&lt;br /&gt;
		   unsigned long lsize)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
unsigned long i,l2;&lt;br /&gt;
   &lt;br /&gt;
l2 = lsize*lsize;&lt;br /&gt;
for (i=0; i&amp;lt;l2; ++i)     &lt;br /&gt;
    {&lt;br /&gt;
     if (i % lsize==lsize-1) *(right+i) = i-lsize+1;/* last col. */&lt;br /&gt;
                        else *(right+i) = i+1; &lt;br /&gt;
     if (i % lsize==0) *(left+i) = i+lsize-1;       /* first col.*/&lt;br /&gt;
                  else *(left+i) = i-1;&lt;br /&gt;
     if (i&amp;lt;lsize) *(up+i) = l2-lsize+i;             /* first row */&lt;br /&gt;
             else *(up+i) = i - lsize;&lt;br /&gt;
     if (i&amp;gt;=l2-lsize) *(down+i) = (i % lsize);      /* last row  */&lt;br /&gt;
                 else *(down+i) = i + lsize;&lt;br /&gt;
    }  &lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
/*****************************************************************&lt;br /&gt;
***                    2D Hexagonal Neighbours                 ***&lt;br /&gt;
***                    Last Modified: 13/08/2012               ***&lt;br /&gt;
***                                                            ***&lt;br /&gt;
***  In a 2D, with periodic boundary conditions, create the    ***&lt;br /&gt;
***  matrixes with the neighbours of all sites. (Honeycomb)    ***&lt;br /&gt;
***                                                            ***&lt;br /&gt;
***  Input: right,left,up1,up2,down1 &amp;amp; down2 -&amp;gt; matrixes with  ***&lt;br /&gt;
***     neighb. sites                                          ***  &lt;br /&gt;
***         l_size -&amp;gt; linear dimension (l_size x l_size)       ***&lt;br /&gt;
***                                                            ***&lt;br /&gt;
**   From right to left, top to bottom,                        ***&lt;br /&gt;
*****************************************************************/&lt;br /&gt;
void neighbours_hexagonal_2d(unsigned long *right,unsigned long *left,&lt;br /&gt;
		   unsigned long *up1, unsigned long *down1, &lt;br /&gt;
		   unsigned long *up2, unsigned long *down2,&lt;br /&gt;
		   unsigned long lsize)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
unsigned long i,l2;&lt;br /&gt;
&lt;br /&gt;
 if (lsize%2==1) &lt;br /&gt;
   {&lt;br /&gt;
     printf(&amp;quot;For honeycomb lattice, LSIZE must be even.\n&amp;quot;);&lt;br /&gt;
     exit(8);&lt;br /&gt;
   }&lt;br /&gt;
 else&lt;br /&gt;
   {&lt;br /&gt;
     unsigned long *up,*down;&lt;br /&gt;
     &lt;br /&gt;
     l2 = lsize*lsize;&lt;br /&gt;
     up=(unsigned long *)calloc(l2,sizeof(unsigned long));&lt;br /&gt;
     down=(unsigned long *)calloc(l2,sizeof(unsigned long));&lt;br /&gt;
     if ((up!=NULL) &amp;amp;&amp;amp; (down!=NULL))&lt;br /&gt;
       {&lt;br /&gt;
	 /*Regular Square lattice*/&lt;br /&gt;
	 for (i=0; i&amp;lt;l2; ++i)     &lt;br /&gt;
	   {&lt;br /&gt;
	     if (i % lsize==lsize-1) *(right+i) = i-lsize+1;/* last col. */&lt;br /&gt;
	     else *(right+i) = i+1; &lt;br /&gt;
	     if (i % lsize==0) *(left+i) = i+lsize-1;       /* first col.*/&lt;br /&gt;
	     else *(left+i) = i-1;&lt;br /&gt;
	     if (i&amp;lt;lsize) *(up+i) = l2-lsize+i;             /* first row */&lt;br /&gt;
	     else *(up+i) = i - lsize;&lt;br /&gt;
	     if (i&amp;gt;=l2-lsize) *(down+i) = (i % lsize);      /* last row  */&lt;br /&gt;
	     else *(down+i) = i + lsize;&lt;br /&gt;
	   }  &lt;br /&gt;
	  /*Modification to hexagonal lattice*/&lt;br /&gt;
	  for (i=0; i&amp;lt;l2; ++i)     &lt;br /&gt;
	    {&lt;br /&gt;
	      if ((i/lsize)%2==1) &lt;br /&gt;
		{&lt;br /&gt;
		  *(up1+i)=*(up+*(left+i));&lt;br /&gt;
		  *(up2+i)=*(up+i);&lt;br /&gt;
		  *(down1+i)=*(down+*(left+i));&lt;br /&gt;
		  *(down2+i)=*(down+i);&lt;br /&gt;
		}&lt;br /&gt;
	      else&lt;br /&gt;
		{&lt;br /&gt;
		  *(up1+i)=*(up+i);&lt;br /&gt;
		  *(up2+i)=*(up+*(right+i));&lt;br /&gt;
		  *(down1+i)=*(down+i);&lt;br /&gt;
		  *(down2+i)=*(down+*(right+i));&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	 free(up);&lt;br /&gt;
	 free(down);&lt;br /&gt;
       }&lt;br /&gt;
     else &lt;br /&gt;
       {&lt;br /&gt;
	 fprintf(stderr,&amp;quot;Error in routine neighbour_hexagonal_2d\n&amp;quot;);&lt;br /&gt;
	 exit(8);&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
 return;&lt;br /&gt;
}&lt;br /&gt;
/*****************************************************************&lt;br /&gt;
***                          3D Neighbours                     ***&lt;br /&gt;
***                    Last Modified: 23/03/1999               ***&lt;br /&gt;
***                                                            ***&lt;br /&gt;
***  In a 3D, with periodic boundary conditions, create the    ***&lt;br /&gt;
***  matrixes with the neighbours of all sites.                ***&lt;br /&gt;
***                                                            ***&lt;br /&gt;
***  Input: right,left,up,down,front, back -&amp;gt; neighb. sites    ***&lt;br /&gt;
***         lsize -&amp;gt; linear dimension (lsize^3)                ***&lt;br /&gt;
*****************************************************************/&lt;br /&gt;
void neighbours_3d(unsigned long *right,unsigned long *left,&lt;br /&gt;
		   unsigned long *up, unsigned long *down,&lt;br /&gt;
		   unsigned long *front, unsigned long *back,&lt;br /&gt;
		   unsigned long lsize)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
unsigned long i,l2,l3;&lt;br /&gt;
&lt;br /&gt;
l2 = lsize*lsize;&lt;br /&gt;
l3 = l2*lsize;&lt;br /&gt;
for (i=0; i&amp;lt;l3; ++i) &lt;br /&gt;
    {&lt;br /&gt;
     if (i % lsize==lsize-1) *(right+i) = i - lsize + 1; /* righmost plane */&lt;br /&gt;
                        else *(right+i) = i+1;&lt;br /&gt;
     if (i % lsize==0) *(left+i) = i + lsize - 1;        /* leftmost plane */&lt;br /&gt;
                  else *(left+i) = i-1;&lt;br /&gt;
     if (i % l2 &amp;lt; lsize) *(up+i) = l2 - lsize + i;       /* top plane */&lt;br /&gt;
                    else *(up+i) = i - lsize;&lt;br /&gt;
     if (i % l2 &amp;gt;= (l2-lsize)) *(down+i) = i + lsize - l2;  /* bottom plane */&lt;br /&gt;
                          else *(down+i) = i + lsize;&lt;br /&gt;
     if (i &amp;lt; l2) *(front+i) = l3 - l2 + i;             /* frontal plane */&lt;br /&gt;
            else *(front+i) = i - l2;&lt;br /&gt;
     if (i &amp;gt;= (l3-l2)) *(back+i) = i % l2;&lt;br /&gt;
                  else *(back+i) = i + l2;             /* back plane */&lt;br /&gt;
    }&lt;br /&gt;
return;&lt;br /&gt;
}         &lt;br /&gt;
/*****************************************************************&lt;br /&gt;
***                          4D Neighbours                     ***&lt;br /&gt;
***                    Last Modified: 09/05/2002               ***&lt;br /&gt;
***                                                            ***&lt;br /&gt;
***  In a 4D, with periodic boundary conditions, create the    ***&lt;br /&gt;
***  matrixes with the neighbours of all sites.                ***&lt;br /&gt;
***                                                            ***&lt;br /&gt;
***  Input: right,left,up,down,front,back,                     ***&lt;br /&gt;
***             front4d,back4d -&amp;gt; neighb. sites                ***&lt;br /&gt;
***         lsize -&amp;gt; linear dimension (lsize^4)                ***&lt;br /&gt;
*****************************************************************/&lt;br /&gt;
void neighbours_4d(unsigned long *right,unsigned long *left,&lt;br /&gt;
		   unsigned long *up, unsigned long *down,&lt;br /&gt;
		   unsigned long *front, unsigned long *back,&lt;br /&gt;
		   unsigned long *front4d, unsigned long *back4d,&lt;br /&gt;
		   unsigned long lsize)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  unsigned long i,l2,l3,l4;&lt;br /&gt;
&lt;br /&gt;
  l2 = lsize*lsize;&lt;br /&gt;
  l3 = l2*lsize;&lt;br /&gt;
  l4 = l2*l2;&lt;br /&gt;
  for (i=0; i&amp;lt;l4; ++i) &lt;br /&gt;
    {&lt;br /&gt;
      if (i % lsize==lsize-1) *(right+i) = i - lsize + 1; /* righmost plane */&lt;br /&gt;
                         else *(right+i) = i+1;&lt;br /&gt;
      if (i % lsize==0) *(left+i) = i + lsize - 1;        /* leftmost plane */&lt;br /&gt;
                   else *(left+i) = i-1;&lt;br /&gt;
      if (i % l2 &amp;lt; lsize) *(up+i) = l2 - lsize + i;       /* top plane */&lt;br /&gt;
                     else *(up+i) = i - lsize;&lt;br /&gt;
      if (i % l2 &amp;gt;= (l2-lsize)) *(down+i) = i + lsize - l2;  /* bottom plane */&lt;br /&gt;
                           else *(down+i) = i + lsize;&lt;br /&gt;
      if (i % l3 &amp;lt; l2) *(front+i) = l3 - l2 + i;           /* frontal plane */&lt;br /&gt;
                  else *(front+i) = i - l2;&lt;br /&gt;
      if (i % l3 &amp;gt;= (l3-l2)) *(back+i) = i - (lsize-1)*l2;&lt;br /&gt;
                   else *(back+i) = i + l2;             /* back plane */&lt;br /&gt;
      if (i &amp;lt; l3) *(front4d+i) = l4 - l3 + i;          /* &#039;front&#039; cube */&lt;br /&gt;
             else *(front4d+i) = i - l3;&lt;br /&gt;
      if (i &amp;gt;=(l4-l3)) *(back4d+i) = i % l3;           /* &#039;back&#039; cube */&lt;br /&gt;
                  else *(back4d+i) = i + l3;&lt;br /&gt;
    }&lt;br /&gt;
return;&lt;br /&gt;
}         &lt;br /&gt;
/*******************************************************************************&lt;br /&gt;
*                   Instantaneous Percolation Measurements                     *&lt;br /&gt;
*                     Last modified:  13/06/2005                               *&lt;br /&gt;
*                                                                              *&lt;br /&gt;
* Remember that a cluster is identified by the last site in the chain of       *&lt;br /&gt;
* pointers.                                                                    *&lt;br /&gt;
*******************************************************************************/&lt;br /&gt;
void unionfind(unsigned long i,unsigned long j, unsigned long *lab)&lt;br /&gt;
          &lt;br /&gt;
{&lt;br /&gt;
unsigned long i1,j1;&lt;br /&gt;
&lt;br /&gt;
i1 = lab[i];                            /* check where i points to          */&lt;br /&gt;
while (lab[i1] != i1)                   /* while it doesn&#039;t point to itself */&lt;br /&gt;
      i1 = lab[i1];&lt;br /&gt;
&lt;br /&gt;
j1 = lab[j];                            /* check where j points to          */&lt;br /&gt;
while (lab[j1] != j1)                   /* while it doesn&#039;t point to itself */&lt;br /&gt;
      j1 = lab[j1];&lt;br /&gt;
&lt;br /&gt;
if (lab[i1] &amp;gt; lab[j1]) lab[i1] = lab[j1];&lt;br /&gt;
                  else lab[j1] = lab[i1];&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**********************************************************************&lt;br /&gt;
***                         Hamming Distance                        ***&lt;br /&gt;
***                   Last modified: 24/01/1999                     ***&lt;br /&gt;
***    Returns the number of different sites between two vectors.   ***&lt;br /&gt;
**********************************************************************/ &lt;br /&gt;
int hamming_distance(int *s1, int *s2, int lsize)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
unsigned long i,temp=0;&lt;br /&gt;
  &lt;br /&gt;
for (i=0; i&amp;lt;lsize; ++i)&lt;br /&gt;
     if (s1[i] != s2[i]) ++temp;&lt;br /&gt;
return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************************************&lt;br /&gt;
***                          Magnetization                         ***&lt;br /&gt;
***                   Last Modified: 30/05/1999                    ***&lt;br /&gt;
***                                                                ***&lt;br /&gt;
*** Return: LSIZE*magnetization                                    ***&lt;br /&gt;
*********************************************************************/&lt;br /&gt;
int magnetization(int *s, int lsize)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
unsigned long i,temp=0;&lt;br /&gt;
   &lt;br /&gt;
for (i=0; i&amp;lt;lsize; ++i)&lt;br /&gt;
    temp += s[i];&lt;br /&gt;
return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int magnetization_diluted(int *s, int *n, int lsize)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
unsigned long i, temp=0;&lt;br /&gt;
   &lt;br /&gt;
for (i=0; i&amp;lt;lsize; ++i)&lt;br /&gt;
    temp += (s[i]*n[i]);&lt;br /&gt;
return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************************************&lt;br /&gt;
***                              Overlap                           ***&lt;br /&gt;
***                    Last Modified: 30/05/1999                   ***&lt;br /&gt;
***                                                                ***&lt;br /&gt;
*** Return: LSIZE*overlap                                          ***&lt;br /&gt;
*********************************************************************/&lt;br /&gt;
int overlap(int *s1, int *s2, int lsize)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
unsigned long i,temp=0;&lt;br /&gt;
   &lt;br /&gt;
for (i=0; i&amp;lt;lsize; ++i)&lt;br /&gt;
    temp += s1[i]*s2[i];&lt;br /&gt;
return temp;&lt;br /&gt;
}                       &lt;br /&gt;
&lt;br /&gt;
int overlap_diluted(int *s1, int *n1, int *s2, int *n2, int lsize)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
unsigned long i,temp=0;&lt;br /&gt;
   &lt;br /&gt;
for (i=0; i&amp;lt;lsize; ++i)&lt;br /&gt;
    temp += s1[i]*n1[i]*s2[i]*n2[i];&lt;br /&gt;
return temp;&lt;br /&gt;
}          &lt;br /&gt;
&lt;br /&gt;
/********************************************************************&lt;br /&gt;
***                   Gaussian Random Number Generator            ***&lt;br /&gt;
***                     Last Modified: 18/05/2000                 ***&lt;br /&gt;
********************************************************************/ &lt;br /&gt;
float ngaussian(void)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
static int iset=0;&lt;br /&gt;
static float gset;&lt;br /&gt;
float fac,r,v1,v2;&lt;br /&gt;
   &lt;br /&gt;
if (iset==0) {&lt;br /&gt;
	      do {&lt;br /&gt;
	  	  v1=2.0*FRANDOM-1.0;&lt;br /&gt;
		  v2=2.0*FRANDOM-1.0;&lt;br /&gt;
		  r=v1*v1+v2*v2;&lt;br /&gt;
	         } &lt;br /&gt;
	      while (r&amp;gt;=1 || r==0.0);&lt;br /&gt;
	      fac=sqrt(-2.0*log(r)/r);&lt;br /&gt;
	      gset=v1*fac;&lt;br /&gt;
	      iset=1;&lt;br /&gt;
	      return v2*fac;&lt;br /&gt;
             }&lt;br /&gt;
        else {&lt;br /&gt;
	      iset=0;&lt;br /&gt;
	      return gset;&lt;br /&gt;
             }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************************************&lt;br /&gt;
***                Create Initial Bond Configuration               ***&lt;br /&gt;
***                    Last modified: 18/05/2000                   ***&lt;br /&gt;
***                                                                ***&lt;br /&gt;
***  The (symmetric) bonds are created depending on the model      ***&lt;br /&gt;
***  up to dimension 3:                                            ***&lt;br /&gt;
***    0. Ferromagnet: all bonds = 1                               ***&lt;br /&gt;
***    1. Spin Glass: same probability of being +1 and -1          ***&lt;br /&gt;
***    2. Spin Glass: gaussian distributed                         ***&lt;br /&gt;
***    3. Fully Frustrated: horizontal connections = +1 and        ***&lt;br /&gt;
***       vertical ones alternating signals such that all minimal  ***&lt;br /&gt;
***       loops are frustrated (LSIZE must be EVEN!)               ***&lt;br /&gt;
***       2D ONLY!!                                                ***&lt;br /&gt;
***                                                                ***&lt;br /&gt;
***    4. Fully Frustrated (Federico)                              ***&lt;br /&gt;
***                                                                ***&lt;br /&gt;
***  The first index follows the rule:                             ***&lt;br /&gt;
***    0. Horizontal coupling;                                     ***&lt;br /&gt;
***    1. Vertical coupling;                                       ***&lt;br /&gt;
***    2. Back coupling;                                           ***&lt;br /&gt;
***                                                                ***&lt;br /&gt;
***  Use 3 for the FF-2D!                                          ***&lt;br /&gt;
*********************************************************************/&lt;br /&gt;
void create_bonds(int model, int coordination, int lsize, &lt;br /&gt;
		  double *connect)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  unsigned long i,k,ll,x,y,z; //l2;&lt;br /&gt;
&lt;br /&gt;
ll = lsize;&lt;br /&gt;
// l2 = lsize*lsize;&lt;br /&gt;
switch (coordination)&lt;br /&gt;
       {&lt;br /&gt;
   	case 2: ll *= lsize;  /* 2D */&lt;br /&gt;
	        break;&lt;br /&gt;
        case 3: ll *= lsize*lsize; /* 3D */&lt;br /&gt;
	        break;&lt;br /&gt;
       default: fprintf(stdout,&amp;quot;Dimension should be either 2 or 3!\n&amp;quot;);&lt;br /&gt;
	        exit(1);&lt;br /&gt;
	        break;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
for (k=0; k&amp;lt;coordination; ++k)&lt;br /&gt;
     for (i=0; i&amp;lt;ll; ++i)&lt;br /&gt;
       switch (model){&lt;br /&gt;
	      case 0: *(connect+k*ll+i) = 1;&lt;br /&gt;
	              break;&lt;br /&gt;
	      case 1: if (FRANDOM&amp;lt;0.5) *(connect+k*ll+i) = 1;&lt;br /&gt;
	                             else *(connect+k*ll+i) = -1;&lt;br /&gt;
		      break;&lt;br /&gt;
	      case 2: *(connect+k*ll+i) = ngaussian();&lt;br /&gt;
	              break;&lt;br /&gt;
	      case 3: *(connect+i) = 1; /* connect[0][i] */&lt;br /&gt;
	              if ((i % lsize) % 2 == 0) *(connect+ll+i) = -1;&lt;br /&gt;
	                                   else *(connect+ll+i) = 1;&lt;br /&gt;
     		      break;&lt;br /&gt;
              case 4: x = i % lsize; /* From Federico */&lt;br /&gt;
                      y = ((i - x) / lsize) % lsize;&lt;br /&gt;
                      z = i / (lsize*lsize);&lt;br /&gt;
                      *(connect+i) = 1;&lt;br /&gt;
                      *(connect+ll+i) = 1;&lt;br /&gt;
                      *(connect+2*ll+i) = 1;&lt;br /&gt;
                      if ((y % 2 == 0) &amp;amp;&amp;amp; (z % 2 == 1))&lt;br /&gt;
                         *(connect+i) = -1;&lt;br /&gt;
                      if ((x % 2 == 0) &amp;amp;&amp;amp; (z % 2 == 0))&lt;br /&gt;
                         *(connect+ll+i) = -1;&lt;br /&gt;
                      if ((x % 2 == 1) &amp;amp;&amp;amp; (y % 2 == 1))&lt;br /&gt;
                         *(connect+2*ll+i) = -1;&lt;br /&gt;
		      break;&lt;br /&gt;
	     default: fprintf(stdout,&amp;quot;Bond set not defined!\n&amp;quot;);&lt;br /&gt;
		      exit(1);&lt;br /&gt;
	              break;&lt;br /&gt;
       }  &lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void create_bonds_a(double aa, int coordination, int lsize, double *connect)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
unsigned long i,k,ll;&lt;br /&gt;
&lt;br /&gt;
ll = lsize*lsize;&lt;br /&gt;
if (coordination==3) ll *= lsize; &lt;br /&gt;
   else if (coordination!=2)&lt;br /&gt;
           fprintf(stdout,&amp;quot;Dimension should be either 2 or 3!\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
for (k=0; k&amp;lt;coordination; ++k)&lt;br /&gt;
     for (i=0; i&amp;lt;ll; ++i)&lt;br /&gt;
       {&lt;br /&gt;
	  if (FRANDOM&amp;lt;aa) *(connect+k*ll+i) = 1;&lt;br /&gt;
	             else *(connect+k*ll+i) = -1;&lt;br /&gt;
       }  &lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************************************&lt;br /&gt;
***                     Create Initial Configuration               ***&lt;br /&gt;
***                      Last modified: 25/04/2000                 ***&lt;br /&gt;
***                                                                ***&lt;br /&gt;
*** Create at random an initial configuration for both S_i and n_i.***&lt;br /&gt;
*********************************************************************/&lt;br /&gt;
void initial_configuration(float mag, float dens, int ll, &lt;br /&gt;
			   int *s, int *n)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
unsigned long i;&lt;br /&gt;
float rm;&lt;br /&gt;
   &lt;br /&gt;
rm = 0.5*(1.0 - mag);  /* fraction of -1 sites */&lt;br /&gt;
if (dens!=0.0)&lt;br /&gt;
     for (i=0; i&amp;lt;ll; ++i)&lt;br /&gt;
       {&lt;br /&gt;
	  if (s != NULL)&lt;br /&gt;
	    {&lt;br /&gt;
	       if (FRANDOM&amp;lt;rm) s[i] = -1;&lt;br /&gt;
	       else s[i] =  1;&lt;br /&gt;
	    }&lt;br /&gt;
	  if (n != NULL)&lt;br /&gt;
	    {&lt;br /&gt;
	       if (FRANDOM&amp;lt;dens) n[i] = 1;&lt;br /&gt;
	       else n[i] = 0;&lt;br /&gt;
	    }&lt;br /&gt;
       }&lt;br /&gt;
   return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************************************&lt;br /&gt;
***                    Measuring Performance (time)                ***&lt;br /&gt;
***                     Last modified: 24/03/1999                  ***&lt;br /&gt;
***                                                                ***&lt;br /&gt;
*** Use:                                                           ***&lt;br /&gt;
***  cpu_time = (clock() - begin_clock) / (double) CLOCKS_PER_SEC; ***&lt;br /&gt;
***  real_time = difftime(time(NULL), begin_time);                 ***&lt;br /&gt;
*********************************************************************/ &lt;br /&gt;
void start_stopwatches(void)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
begin_cpu_time = clock();&lt;br /&gt;
begin_real_time = time(NULL);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*********************************************************************&lt;br /&gt;
***                     Simple Matrix Operations                   ***&lt;br /&gt;
***                    Last Modified: 18/05/2000                   ***&lt;br /&gt;
***                                                                ***&lt;br /&gt;
*********************************************************************/&lt;br /&gt;
void copymatrix(int *s1, int *s2, int lsize)&lt;br /&gt;
{&lt;br /&gt;
unsigned long i;&lt;br /&gt;
   &lt;br /&gt;
for (i=0; i&amp;lt;lsize; ++i)&lt;br /&gt;
    s1[i]=s2[i];&lt;br /&gt;
return;&lt;br /&gt;
}               &lt;br /&gt;
&lt;br /&gt;
void copymatrix_f(float *s1, float *s2, int lsize)&lt;br /&gt;
{&lt;br /&gt;
  unsigned long i;&lt;br /&gt;
  &lt;br /&gt;
  for (i=0; i&amp;lt;lsize; ++i)&lt;br /&gt;
    s1[i]=s2[i];&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void zeromatrix_i(int *s1, int lsize)&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  unsigned long i;&lt;br /&gt;
  &lt;br /&gt;
  for (i=0; i&amp;lt;lsize; ++i)&lt;br /&gt;
    s1[i]=0;&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void zeromatrix_l(long *s1, int lsize)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
unsigned long i;&lt;br /&gt;
   &lt;br /&gt;
for (i=0; i&amp;lt;lsize; ++i)&lt;br /&gt;
    s1[i]=0;&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void zeromatrix_ul(unsigned long *s1, int lsize)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
  unsigned long i;&lt;br /&gt;
  &lt;br /&gt;
  for (i=0; i&amp;lt;lsize; ++i)&lt;br /&gt;
    s1[i]=0;&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void zeromatrix_sl(signed long *s1, int lsize)&lt;br /&gt;
{&lt;br /&gt;
unsigned long i;&lt;br /&gt;
   &lt;br /&gt;
for (i=0; i&amp;lt;lsize; ++i)&lt;br /&gt;
    s1[i]=0;&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void zeromatrix_f(float *s1, int lsize)&lt;br /&gt;
{&lt;br /&gt;
  unsigned long i;&lt;br /&gt;
  &lt;br /&gt;
  for (i=0; i&amp;lt;lsize; ++i)&lt;br /&gt;
    s1[i]=0.0;&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void zeromatrix_d(double *s1, int lsize)&lt;br /&gt;
{&lt;br /&gt;
unsigned long i;&lt;br /&gt;
   &lt;br /&gt;
for (i=0; i&amp;lt;lsize; ++i)&lt;br /&gt;
    s1[i]=0.0;&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**********************************************************************&lt;br /&gt;
***                          Create Time Table                      ***&lt;br /&gt;
***                    Last Modified: 04/08/1999                    ***&lt;br /&gt;
**********************************************************************/&lt;br /&gt;
void create_time_table(long *t1,long *t2,int power, int base)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
long i,j;&lt;br /&gt;
   &lt;br /&gt;
t1[0] = 1;&lt;br /&gt;
for (i=1; i&amp;lt;power; i++)&lt;br /&gt;
     t1[i] = t1[i-1]*base;&lt;br /&gt;
if (t2 != NULL)&lt;br /&gt;
   {&lt;br /&gt;
     for (i=0; i&amp;lt;power; i++)&lt;br /&gt;
       for (j=0; j&amp;lt;power; j++)&lt;br /&gt;
	 {&lt;br /&gt;
	   *(t2+i*power+j) = t1[i] + t1[j];&lt;br /&gt;
	   if (*(t2+i*power+j) == base*t1[power-1]) *(t2+i*power+j) =base*t1[power-1];&lt;br /&gt;
	   if (*(t2+i*power+j) &amp;gt; base*t1[power-1]) *(t2+i*power+j) =-1;&lt;br /&gt;
	   &lt;br /&gt;
	 }&lt;br /&gt;
   }&lt;br /&gt;
return;&lt;br /&gt;
}                    &lt;br /&gt;
&lt;br /&gt;
/*********************************************************************&lt;br /&gt;
***                         Time Table 2                           ***&lt;br /&gt;
***                    Last Modified: 08/01/2000                   ***&lt;br /&gt;
***  The total number of time steps and the number of measures are ***&lt;br /&gt;
***  specified.                                                    ***&lt;br /&gt;
*********************************************************************/&lt;br /&gt;
void create_time_table_2(long *t1, int total_time, int measures)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
unsigned long i,k;&lt;br /&gt;
double temp;&lt;br /&gt;
   &lt;br /&gt;
t1[0] = 0;&lt;br /&gt;
temp = pow((double) total_time,1.0/(measures-1));&lt;br /&gt;
k=0;&lt;br /&gt;
for (i=1; i&amp;lt;measures; ++i)&lt;br /&gt;
    {&lt;br /&gt;
     t1[i] = (int) pow(temp, (double) i);&lt;br /&gt;
     if (t1[i]&amp;lt;=k) t1[i]=k+1;&lt;br /&gt;
     k = t1[i];&lt;br /&gt;
    }&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*********************************************************************&lt;br /&gt;
***                         Time Table                             ***&lt;br /&gt;
*********************************************************************/&lt;br /&gt;
void create_time_table_fa(float *t1, float *t2, int decades)&lt;br /&gt;
  &lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  unsigned long j,k=1;&lt;br /&gt;
  signed int i=-3;&lt;br /&gt;
  &lt;br /&gt;
  t1[0] = 0;&lt;br /&gt;
  while (i &amp;lt;= decades)&lt;br /&gt;
    {&lt;br /&gt;
      &lt;br /&gt;
      t1[k] = pow(10,i-1);&lt;br /&gt;
      ++k;&lt;br /&gt;
      for (j=2; j&amp;lt;10; ++j)&lt;br /&gt;
	{&lt;br /&gt;
	  t1[k] = t1[k-1] + pow(10,i-1);&lt;br /&gt;
	  ++k;&lt;br /&gt;
	}&lt;br /&gt;
      ++i;&lt;br /&gt;
    }&lt;br /&gt;
  t1[k] = pow(10,i-1);&lt;br /&gt;
  &lt;br /&gt;
  if (t2 != NULL)&lt;br /&gt;
    {&lt;br /&gt;
      &lt;br /&gt;
      for (i=0; i&amp;lt;decades+5; i++)&lt;br /&gt;
        for (j=0; j&amp;lt;(decades+4)*9+2; j++)&lt;br /&gt;
	  {&lt;br /&gt;
	    if (i==0) *(t2+i*((decades+4)*9+2)+j) = t1[j];&lt;br /&gt;
	    else &lt;br /&gt;
	      *(t2+i*((decades+4)*9+2)+j) = t1[9*i+1] + t1[j];&lt;br /&gt;
	    /*if (*(t2+i*10+j) == base*t1[power-1]) *(t2+i*power+j) =base*t1[power-1];&lt;br /&gt;
	      if (*(t2+i*10+j) &amp;gt; base*t1[power-1]) *(t2+i*power+j) =-1;*/&lt;br /&gt;
	  }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Diagrama.gif&amp;diff=3114</id>
		<title>Arquivo:Diagrama.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Diagrama.gif&amp;diff=3114"/>
		<updated>2020-11-27T07:42:26Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3113</id>
		<title>Gás de Rede 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3113"/>
		<updated>2020-11-27T07:41:36Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &lt;br /&gt;
Este trabalho tem o intuito de apresentar uma descrição do modelo do Gás de Rede bidimensional e traçar paralelos com o modelo de Ising, discutindo a relação entre seus Hamiltonianos.&lt;br /&gt;
&lt;br /&gt;
== Gás de Rede ==&lt;br /&gt;
&lt;br /&gt;
O Modelo do Gás de Rede 2D consiste em um sistema de &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas da forma &amp;lt;math&amp;gt;\sigma = {\sigma_1, \sigma_1, \dotsc, \sigma_N}&amp;lt;/math&amp;gt; onde cada sítio da rede pode assumir o valor &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, ocupado por uma partícula, ou &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;, não ocupado por uma partícula. A energia total do sistema é dada pelo Hamiltoniano do Gás de Rede, descrito pela equação&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \epsilon \sum_{\langle i,j \rangle} \sigma_i \sigma_j \qquad (1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde o somatório é dado entre os quatro vizinhos mais próximos e &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; é a constante de interação entre as partículas, para &amp;lt;math&amp;gt;\epsilon \geq 0&amp;lt;/math&amp;gt; a interação é atrativa. Por se tratar de uma rede quadrada com &amp;lt;math&amp;gt;L^2 = L \times L&amp;lt;/math&amp;gt; sítios, apenas uma parcela da rede é ocupada por partículas, ou seja, possuímos uma densidade constante &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; de partículas. Podemos expressar a condição da densidade constante da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} \sigma_i = \rho L^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazendo uma mudança de variáveis da forma &amp;lt;math&amp;gt;s_i = 2 \sigma_i - 1&amp;lt;/math&amp;gt; saímos da situação de ocupação e não ocupação de sítios e obtemos variáveis do Modelo de Ising &amp;lt;ref name=ISING&amp;gt; https://fiscomp.if.ufrgs.br/index.php/Ising_2D&amp;lt;/ref&amp;gt;, spins Up e Down. A variável &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; assume valor &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; (up) quando o sítio esta ocupado por uma partícula e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; quando não está. Aplicando a mudança de variáveis no Hamiltoniano do Gás de Rede obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} (s_i + 1)(s_j + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}[s_i s_j + s_i + s_j + 1]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Abrindo os termos dos três últimos somatórios se encontra que&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle}s_i = \sum_{\langle i,j \rangle}s_j = z \sum_{i}s_i&amp;lt;/math&amp;gt;, e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle} 1 = z L^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
o que simplifica a expressão para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{2} \epsilon z \sum_{i} s_i - \frac{1}{4} \epsilon z L^2 \qquad (2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; é o número de coordenação, isto é, o número de vizinhos de cada sítio, que para a rede quadrada é 4. Note a mudança no índice do somatório de &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Vemos que este Hamiltoniano possui a forma do Hamiltoniano do modelo de Ising com aplicação de um campo magnético externo, a menos de uma constante. Entretanto, com a densidade constante, fazendo a mesma mudança de variáveis, obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} s_i = (2\rho - 1) L^2 \qquad (3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicando essa relação no Hamiltoniano obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} s_i s_j - z \epsilon L^2 \rho  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; são constantes, o segundo termo é constante. Definindo &amp;lt;math&amp;gt;J = \epsilon / 4&amp;lt;/math&amp;gt; o Hamiltoniano se torna&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - J \sum_{\langle i,j \rangle} s_i s_j + \text{constante}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A constante não influencia nos valores da medida, pois ela se cancela na equação de mudança de estado &amp;lt;ref name=BARKEMA&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;. Vemos que, ao assumir a densidade constante, o modelo do Gás de Rede se torna o modelo de Ising sem a presença de um campo magnético. A condição da densidade constante é a magnetização total do modelo. &lt;br /&gt;
&lt;br /&gt;
É interessante notar que podemos tratar o modelo do gás de rede de duas formas: &#039;&#039;&#039;(a)&#039;&#039;&#039; assumir a densidade constante e utilizar o primeiro Hamiltoniano apresentado, ou &#039;&#039;&#039;(b)&#039;&#039;&#039; não assumir a densidade constante, aplicar a mudança de variáveis discutida e utilizar o Hamiltoniano que possuí a forma de Ising com campo magnético.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Método de Monte Carlo==&lt;br /&gt;
&lt;br /&gt;
===Princípios gerais===&lt;br /&gt;
&lt;br /&gt;
Para desenvolver a dinâmica do gás de rede, isto é, fazer com que ocorram alterações na posição das partículas, recorre-se ao método de Monte Carlo. Trata-se, em linhas gerais, de um método estatístico baseado em amostragem aleatória. É comum, ao introduzir-se o assunto, utilizar problemas de cálculo de áreas, como, por exemplo, a clássica história das crianças que desenharam, na areia, um círculo contido em um quadrado, de modo que o diâmetro do círculo seja igual ao lado do quadrado. Jogam, aleatoriamente, pedras no quadrado. Após uma grande quantidade de arremessos, compara-se o valor de pedras que estão dentro do círculo com o número total dentro do quadrado, fazendo a razão entre esses dois valores, encontra-se uma aproximação para a razão entre a área do círculo e a do quadrado, que equivale a &amp;lt;math&amp;gt;\pi/4&amp;lt;/math&amp;gt;. Desse modo, pode ser encontrada uma aproximação do valor de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; através do método de Monte Carlo, que simula uma aproximação experimental&amp;lt;ref name=KRAUTH&amp;gt;Krauth ,W. ,&amp;quot;Statistical Mechanics: Algorithms and Computations&amp;quot;. Oxford Master Series in Physics, Oxford University Press, 2006.&amp;lt;/ref&amp;gt;. É possível propor um novo modelo, no qual o quadrado é grande e as pedras são atiradas aleatoriamente de dentro do quadrado, de modo que a posição de arremesso é atualizada para a posição da última pedra jogada. A principal alteração nesse método é a possibilidade de que uma pedra seja atirada para fora do quadrado. Nesse caso, a posição para o próximo arremesso não muda e as pedras que foram parar fora das bordas do quadrado são empilhadas naquela posição. Essas mudanças no método caracterizam a aplicação de Monte Carlo em uma cadeia de Markov, definida de modo que a configuração do próximo estado depende somente da configuração atual. Até aqui, vimos o método de Monte Carlo aplicado em situações nas quais a probabilidade de um evento ocorrer na configuração subsequente do sistema é zero ou um. Para novas distribuições de probabilidade, utiliza-se o algoritmo de Metrópolis.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo de Metrópolis===&lt;br /&gt;
&lt;br /&gt;
Como mencionado, o método de Monte Carlo funciona através de atualizações em um sistema, fazendo com que ele passe de um estado para outro. Consideremos &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; como sendo o estado atual do sistema. O próximo estado será chamado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Chamamos a probabilidade do sistema passar do estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt;. A ideia do algoritmo de Metrópolis é aplicar essa probabilidade no método de Monte Carlo. Para isso, um método muito utilizado é calcular a probabilidade &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt; e compará-la a um número aleatório &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, de modo que &amp;lt;math&amp;gt;0&amp;lt;r&amp;lt;1&amp;lt;/math&amp;gt;. Se &amp;lt;math&amp;gt; p(\mu\to\nu)&amp;gt;r&amp;lt;/math&amp;gt;, então o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é adotado pelo sistema. Para aplicar essas ideias ao problema do gás de rede, o método mais simples é utilizando o algoritmo de Kawasaki, que faz com que dois sítios, selecionados aleatoriamente, tenham seus valores trocados. Isso implica que a magnetização do sistema será constante&amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;. Para calcular a probabilidade de aceitação dessa mudança, calcula-se a variação de energia entre os estados,&amp;lt;math&amp;gt;\Delta E= E_{\nu}-E_{\mu}&amp;lt;/math&amp;gt;, e aplica-se o valor obtido na equação de probabilidade de aceitação de Metrópolis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\mu\to\nu)=\left\{\begin{array}{rc} e^{\frac{-\Delta E}{k_BT}}, \quad \text{se}\quad \Delta E&amp;gt;0\\&lt;br /&gt;
1, \quad \text{caso contrario}\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, inicialmente foram feitas algumas alterações no algoritmo de Kawasaki. Limita-se a troca de valores somente entre um sítio e seus quatro vizinhos principais (isto é, acima, abaixo, à direita e à esquerda). Isso porque se tinha a intenção de recriar o comportamento difusivo de um gás no modelo do gás de rede em duas dimensões, porém, essa escolha para a dinâmica das simulações limita em muito a facilidade do sistema equilibrar, como será mostrado na parte de resultados. O algoritmo inicial consiste na seguinte ideia: No estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, seleciona-se aleatoriamente um sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. A partir dele, é sorteado um de seus vizinhos, digamos, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, com o qual haverá a troca de valor. Antes que ocorra a troca, são calculados os valores de dois Hamiltonianos: o que relaciona o sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; com seus vizinhos e o que relaciona &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; com seus vizinhos. Somados, eles representam o valor de &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt;. Após a troca, esses valores são recalculados, formando o valor de &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt;. Com esses valores, segue-se o cálculo da probabilidade da forma usual. &lt;br /&gt;
&lt;br /&gt;
Após verificar que a dinâmica inicialmente escolhida não era apropriada, optou-se por usar o algoritmo de Kawasaki tradicional, fazendo uso de uma listagem de quais eram os estados dos sítios e escolhendo os pares a serem trocados sempre como sítios de estados diferentes. Isso faz com que a aceitação do algoritmo de Monte Carlo seja muito mais elevada que ao do nosso algoritmo inicial, pois no caso em que grandes clusters são formados as trocas eram sempre rejeitadas de acordo com a dinâmica inicial.&lt;br /&gt;
&lt;br /&gt;
===Considerações práticas===&lt;br /&gt;
&lt;br /&gt;
Já consideramos os aspectos iniciais do método de Monte Carlo, mostrando suas aplicações. Vimos, do mesmo modo, a utilização do algoritmo de Metrópolis, dentro do qual aplicamos o algoritmo de Kawasaki (modificado) para desenvolver o sistema do gás de rede. Resta elucidar a função do parâmetro temporal, isto é, como as iterações desses algoritmos influenciam o sistema. Primeiramente, deve-se fixar um valor para o número de passos temporais que serão realizados. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações  do algoritmo de Metrópolis, abordado acima, sendo &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; o lado da rede quadrada. Chamamos de Passo de Monte Carlo (MCS) cada um desses passos temporais. Em outras palavras: em cada passo de Monte Carlo, todos os sítios tem a possibilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
=== Eficiência da dinâmica local ===&lt;br /&gt;
&lt;br /&gt;
Como mencionado acima, a primeira dinâmica escolhida foi a que restringe os sítios a trocarem de estado para apenas aqueles que são vizinhos próximos (os 4 acima, abaixo, a direita e a esquerda). Se verificou ao analisar os dados das simulações que na verdade essa dinâmica não era apropriada, pois a aceitação do algoritmo é muito baixa e com a amostragem escolhida (&amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS) o sistema ainda não estaria equilibrado. Isso pode ser percebido mais facilmente observando os histogramas das simulações. Sabe-se que a distribuição das grandezas macroscópicas de um sistema termodinâmico é a distribuição de Boltzmann &amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, então se espera para o sistema analisado que a energia tenha uma distribuição normal de frequências. Observe a diferença entre as distribuições para a energia do sistema no caso da dinâmica local inicialmente escolhida e no caso do algoritmo tradicional de Kawasaki:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Diferença entre distribuições para a energia do sistema por dinâmica escolhida.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Assim podemos notar que o sistema não está equilibrado após a amostragem com a dinâmica local. No caso do algoritmo tradicional o sistema se encontra em equilíbrio. Para temperaturas mais altas, acima da temperatura crítica para cada modelo onde não há mais separação de fase, a dinâmica tem eficiência satisfatória, pois a aceitação do algoritmo de Monte Carlo é maior já que sem a formação de grandes clusters a probabilidade de uma partícula ser selecionada e poder trocar para um sítio vazio que seja seu vizinho é muito maior. Contudo, ainda assim é mais vantajoso executar as simulações na linguagem de Ising, já que a aceitação do algoritmo ainda é maior do que para a dinâmica local proposta, então a quantidade de dados descorrelacionados para a mesma amostragem de &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS é maior. Dessa maneira, para uma amostragem de mesmo tamanho, o valor estimado para uma grandeza &amp;lt;math&amp;gt;\langle Q \rangle&amp;lt;/math&amp;gt; é mais preciso no caso da dinâmica proposta pelo algoritmo de Kawasaki, e para uma mesma precisão no valor estimado seria necessária uma amostragem menor do que a da dinâmica local.&lt;br /&gt;
A referência na qual esse trabalho mais se inspira, Monte Carlo Methods in Statistical Physics, de Newman e Barkema, não dá a devida ênfase para quão interessante computacionalmente é se manter na linguagem do modelo de Ising e adotar o algoritmo de Kawasaki.&lt;br /&gt;
É importante notar que as simulações da dinâmica de Kawasaki foram feitas na linguagem do modelo de Ising, com spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, ao invés de sítios ocupados por partículas &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; e sítios desocupados &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Essa mudança é importante para entender a mudança na escala das grandezas entre as simulações. Como a constante de interação &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; do modelo de Ising é um quarto da constante &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, a temperatura e a energia no modelo de Ising valem &amp;lt;math&amp;gt;\frac{1}{4}&amp;lt;/math&amp;gt; da temperatura e da energia nas simulações com a dinâmica local na linguagem do gás de rede.&lt;br /&gt;
&lt;br /&gt;
=== Separação de fases ===&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:sep_fases.gif|thumb|center|none|alt=Alt text|Animação ilustrando a separação de fases no modelo de Ising com magnetização constante. Note como ocorre a formação de clusters.|480px]]&lt;br /&gt;
&lt;br /&gt;
=== Energia e efeito do tamanho da rede ===&lt;br /&gt;
&lt;br /&gt;
A grandeza que foi medida nas simulações é a energia total do sistema. Para analisar os efeitos do tamanho da rede devemos comparar os valores das energias por número de sítios, já que quanto maior a rede maior o número de partículas e portanto maior o valor absoluto da energia. Abaixo temos um gráfico com os valores da energia total do sistema por número de sítios em função da temperatura, com os dados das três redes simuladas (L = 16, 32, 64).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:energia.png|thumb|center|none|alt=Alt text|Energia total do sistema dividida pelo número de sítios em função da temperatura para redes de tamanhos diferentes. Cada ponto no gráfico é a média de 5 amostragens com seu desvio padrão.|480px]]&lt;br /&gt;
&lt;br /&gt;
Aqui o comportamento da energia é como esperado para o modelo. Há uma queda no valor da energia conforme a temperatura do reservatório diminui abaixo da temperatura crítica, e conforme a temperatura aumenta acima da temperatura crítica, a energia aumenta mais devagar dado que é o estado em que o sistema está na sua fase amorfa.&lt;br /&gt;
&lt;br /&gt;
Algo que se nota no gráfico acima é a diferença nos valores da energia das redes &amp;lt;math&amp;gt;L = 32&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. É perceptível que as duas redes maiores apresentam valores de energia muito mais próximos. Isso se dá justamente pelo tamanho da rede e o fato da densidade ser a mesma.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Ilustração dos estados de menor energia&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:rede16.png|thumb|center|upright=4|none|alt= Alt text|Diagrama ilustrando o estado de menor energia para a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. As cores indicam o número de sítios vizinhos ocupados.|480px]]&lt;br /&gt;
|[[Arquivo:diagrama.gif|thumb|upright=4|none|alt=Alt text|Animação ilustrando o número de partículas internas ao cluster se tornando mais relevante que o número de partículas nas bordas conforme a rede aumenta.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Para entender como o valor da energia total do sistema por número de sítios varia com o tamanho da rede é interessante calcular essa grandeza no estado de menor energia. No caso da rede quadrada, o estado de menor energia é um cluster quadrado. Como ilustrado no diagrama acima, existem sítios com 3 vizinhos ocupados e sítios com 2 vizinhos ocupados. Estes são os da borda do cluster. Todos os outros internos ao cluster tem 4 vizinhos ocupados e portanto contribuem com &amp;lt;math&amp;gt;-4\epsilon&amp;lt;/math&amp;gt; para o Hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
Nesse trabalho adotamos &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt;, o que facilita o cálculo da energia total, pois o tamanho do lado do cluster é &amp;lt;math&amp;gt; l = \sqrt{\frac{L^2}{4}}&amp;lt;/math&amp;gt;. Temos &amp;lt;math&amp;gt;(l - 2)^2&amp;lt;/math&amp;gt; partículas internas ao cluster e portanto com 4 vizinhos e &amp;lt;math&amp;gt;4(l - 2)&amp;lt;/math&amp;gt; partículas nas bordas com 3 vizinhos. O Hamiltoniano é portanto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = (-2\epsilon)4 + (-3\epsilon)4(l - 2) + (-4\epsilon)(l - 2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O primeiro termo é a referente às interações dos 4 cantos do cluster, que tem apenas 2 vizinhos ocupados. Abrindo os termos e simplificando a equação chegamos ao valor do Hamiltoniano do estado de menor energia do gás de rede:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = -(L^2 - 2L)\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo por 2 para encontrar o valor da energia total e então por &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;e = \frac{E}{L^2} = - \frac{\epsilon}{2} + \frac{\epsilon}{L}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
que é a grandeza apresentada no gráfico anterior. Essa elaboração foi feita para o modelo do gás de rede, porém as simulações foram feitas com o modelo de Ising, com a restrição de que a magnetização era constante (a quantidade de spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é constante).&lt;br /&gt;
&lt;br /&gt;
Usando a equação &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;J = \frac{\epsilon}{4}&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J\sum{i}s_i - 4JL^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utilizamos então a equação &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt; e percebemos que os termos do meio e da direita se cancelam, deixando somente o primeiro termo para avaliarmos em termos do estado de menor energia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J(2\rho - 1)L^2 - 4JL^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; = -J\sum_{\langle i, j \rangle}s_i s_j &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora podemos avaliar o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições. Para isso podemos nos basear no diagrama usado anteriormente, com a ressalva de que os sítios imediatamente fora do cluster também interagem com ele, já que temos agora spins &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; ao invés de sítios vazios. Temos o mesmo número de spins internos ao cluster que de pariculas anteriormente, assim como para as bordas do cluster e os mesmos quatro cantos. Além disso, os sítios fora do cluster também tem contribuição para o Hamiltoniano. O número de spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;L^2 - \frac{L^2}{4} - 2L&amp;lt;/math&amp;gt; e o número de spins fora do cluster com 1 vizinho &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;2L&amp;lt;/math&amp;gt;. Agora podemos somar todas essas contribuições.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = (-4J)(L^2 - \frac{L^2}{4} - 2L) + (-2J)(2L) + (-2J)4(\frac{L}{2} - 2) + (-4J)(\frac{L}{2} - 2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da esquerda para a direita os termos são a contribuição dos spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, dos spins fora do cluster mas com um vizinho no cluster, dos spins na borda do cluster e dos spins interiores ao cluster. Abrindo os termos e simplificando a equação chegamos finalmente em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -(4L^2 - 8L)J&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E como nas simulações foram utilizadas que &amp;lt;math&amp;gt;\epsilon = 1&amp;lt;/math&amp;gt; para o caso do gás de rede e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt; para o modelo de Ising, temos portanto que as energias medidas com o modelo de Ising são equivalentes a 4 vezes as energias no modelo do gás de rede, como se verificou ao implementar a mesma função de medida para a linguagem de spins e de sítios vazios e ocupados. E com essa equação para o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições podemos perceber que o efeito do tamanho de rede é praticamente o mesmo, com a ressalva de que a energia por sítio deve ser também 4 vezes a energia por sítio do modelo do gás de rede.&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
&lt;br /&gt;
Passamos pelo que vem a ser o modelo do gás de rede na rede quadrada e apresentamos sua relação com o modelo de Ising. O Hamiltoniano do modelo do gás de rede nos mostra que ele é idêntico ao modelo de Ising com um termo de campo magnético externo. Ao fixarmos a densidade do modelo do gás de rede, impomos a restrição de que o modelo de Ising deve ter a magnetização constante para mantermos a equivalência. Também se discutiu o efeito do tamanho das redes simuladas e vimos que quanto maior o tamanho da rede mais próximo será o valor das energias por sítio em comparação com redes de tamanhos similares e vimos que isso se deve pelo fato do número de sítios no cluster do estado de menor energia crescer mais rápido no interior do cluster do que em seu perímetro.&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é a temperatura do banho térmico e o terceiro é a semente utilizada pelo gerador de números pseudo-aleatórios. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DGNU prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede com Densidade Constante e dinâmica local]]&lt;br /&gt;
&lt;br /&gt;
[[Modelo de ising com magnetização constante e algoritmo de Kawasaki]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3112</id>
		<title>Gás de Rede 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3112"/>
		<updated>2020-11-27T07:40:10Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &lt;br /&gt;
Este trabalho tem o intuito de apresentar uma descrição do modelo do Gás de Rede bidimensional e traçar paralelos com o modelo de Ising, discutindo a relação entre seus Hamiltonianos.&lt;br /&gt;
&lt;br /&gt;
== Gás de Rede ==&lt;br /&gt;
&lt;br /&gt;
O Modelo do Gás de Rede 2D consiste em um sistema de &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas da forma &amp;lt;math&amp;gt;\sigma = {\sigma_1, \sigma_1, \dotsc, \sigma_N}&amp;lt;/math&amp;gt; onde cada sítio da rede pode assumir o valor &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, ocupado por uma partícula, ou &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;, não ocupado por uma partícula. A energia total do sistema é dada pelo Hamiltoniano do Gás de Rede, descrito pela equação&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \epsilon \sum_{\langle i,j \rangle} \sigma_i \sigma_j \qquad (1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde o somatório é dado entre os quatro vizinhos mais próximos e &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; é a constante de interação entre as partículas, para &amp;lt;math&amp;gt;\epsilon \geq 0&amp;lt;/math&amp;gt; a interação é atrativa. Por se tratar de uma rede quadrada com &amp;lt;math&amp;gt;L^2 = L \times L&amp;lt;/math&amp;gt; sítios, apenas uma parcela da rede é ocupada por partículas, ou seja, possuímos uma densidade constante &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; de partículas. Podemos expressar a condição da densidade constante da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} \sigma_i = \rho L^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazendo uma mudança de variáveis da forma &amp;lt;math&amp;gt;s_i = 2 \sigma_i - 1&amp;lt;/math&amp;gt; saímos da situação de ocupação e não ocupação de sítios e obtemos variáveis do Modelo de Ising &amp;lt;ref name=ISING&amp;gt; https://fiscomp.if.ufrgs.br/index.php/Ising_2D&amp;lt;/ref&amp;gt;, spins Up e Down. A variável &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; assume valor &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; (up) quando o sítio esta ocupado por uma partícula e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; quando não está. Aplicando a mudança de variáveis no Hamiltoniano do Gás de Rede obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} (s_i + 1)(s_j + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}[s_i s_j + s_i + s_j + 1]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Abrindo os termos dos três últimos somatórios se encontra que&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle}s_i = \sum_{\langle i,j \rangle}s_j = z \sum_{i}s_i&amp;lt;/math&amp;gt;, e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle} 1 = z L^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
o que simplifica a expressão para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{2} \epsilon z \sum_{i} s_i - \frac{1}{4} \epsilon z L^2 \qquad (2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; é o número de coordenação, isto é, o número de vizinhos de cada sítio, que para a rede quadrada é 4. Note a mudança no índice do somatório de &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Vemos que este Hamiltoniano possui a forma do Hamiltoniano do modelo de Ising com aplicação de um campo magnético externo, a menos de uma constante. Entretanto, com a densidade constante, fazendo a mesma mudança de variáveis, obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} s_i = (2\rho - 1) L^2 \qquad (3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicando essa relação no Hamiltoniano obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} s_i s_j - z \epsilon L^2 \rho  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; são constantes, o segundo termo é constante. Definindo &amp;lt;math&amp;gt;J = \epsilon / 4&amp;lt;/math&amp;gt; o Hamiltoniano se torna&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - J \sum_{\langle i,j \rangle} s_i s_j + \text{constante}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A constante não influencia nos valores da medida, pois ela se cancela na equação de mudança de estado &amp;lt;ref name=BARKEMA&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;. Vemos que, ao assumir a densidade constante, o modelo do Gás de Rede se torna o modelo de Ising sem a presença de um campo magnético. A condição da densidade constante é a magnetização total do modelo. &lt;br /&gt;
&lt;br /&gt;
É interessante notar que podemos tratar o modelo do gás de rede de duas formas: &#039;&#039;&#039;(a)&#039;&#039;&#039; assumir a densidade constante e utilizar o primeiro Hamiltoniano apresentado, ou &#039;&#039;&#039;(b)&#039;&#039;&#039; não assumir a densidade constante, aplicar a mudança de variáveis discutida e utilizar o Hamiltoniano que possuí a forma de Ising com campo magnético.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Método de Monte Carlo==&lt;br /&gt;
&lt;br /&gt;
===Princípios gerais===&lt;br /&gt;
&lt;br /&gt;
Para desenvolver a dinâmica do gás de rede, isto é, fazer com que ocorram alterações na posição das partículas, recorre-se ao método de Monte Carlo. Trata-se, em linhas gerais, de um método estatístico baseado em amostragem aleatória. É comum, ao introduzir-se o assunto, utilizar problemas de cálculo de áreas, como, por exemplo, a clássica história das crianças que desenharam, na areia, um círculo contido em um quadrado, de modo que o diâmetro do círculo seja igual ao lado do quadrado. Jogam, aleatoriamente, pedras no quadrado. Após uma grande quantidade de arremessos, compara-se o valor de pedras que estão dentro do círculo com o número total dentro do quadrado, fazendo a razão entre esses dois valores, encontra-se uma aproximação para a razão entre a área do círculo e a do quadrado, que equivale a &amp;lt;math&amp;gt;\pi/4&amp;lt;/math&amp;gt;. Desse modo, pode ser encontrada uma aproximação do valor de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; através do método de Monte Carlo, que simula uma aproximação experimental&amp;lt;ref name=KRAUTH&amp;gt;Krauth ,W. ,&amp;quot;Statistical Mechanics: Algorithms and Computations&amp;quot;. Oxford Master Series in Physics, Oxford University Press, 2006.&amp;lt;/ref&amp;gt;. É possível propor um novo modelo, no qual o quadrado é grande e as pedras são atiradas aleatoriamente de dentro do quadrado, de modo que a posição de arremesso é atualizada para a posição da última pedra jogada. A principal alteração nesse método é a possibilidade de que uma pedra seja atirada para fora do quadrado. Nesse caso, a posição para o próximo arremesso não muda e as pedras que foram parar fora das bordas do quadrado são empilhadas naquela posição. Essas mudanças no método caracterizam a aplicação de Monte Carlo em uma cadeia de Markov, definida de modo que a configuração do próximo estado depende somente da configuração atual. Até aqui, vimos o método de Monte Carlo aplicado em situações nas quais a probabilidade de um evento ocorrer na configuração subsequente do sistema é zero ou um. Para novas distribuições de probabilidade, utiliza-se o algoritmo de Metrópolis.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo de Metrópolis===&lt;br /&gt;
&lt;br /&gt;
Como mencionado, o método de Monte Carlo funciona através de atualizações em um sistema, fazendo com que ele passe de um estado para outro. Consideremos &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; como sendo o estado atual do sistema. O próximo estado será chamado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Chamamos a probabilidade do sistema passar do estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt;. A ideia do algoritmo de Metrópolis é aplicar essa probabilidade no método de Monte Carlo. Para isso, um método muito utilizado é calcular a probabilidade &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt; e compará-la a um número aleatório &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, de modo que &amp;lt;math&amp;gt;0&amp;lt;r&amp;lt;1&amp;lt;/math&amp;gt;. Se &amp;lt;math&amp;gt; p(\mu\to\nu)&amp;gt;r&amp;lt;/math&amp;gt;, então o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é adotado pelo sistema. Para aplicar essas ideias ao problema do gás de rede, o método mais simples é utilizando o algoritmo de Kawasaki, que faz com que dois sítios, selecionados aleatoriamente, tenham seus valores trocados. Isso implica que a magnetização do sistema será constante&amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;. Para calcular a probabilidade de aceitação dessa mudança, calcula-se a variação de energia entre os estados,&amp;lt;math&amp;gt;\Delta E= E_{\nu}-E_{\mu}&amp;lt;/math&amp;gt;, e aplica-se o valor obtido na equação de probabilidade de aceitação de Metrópolis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\mu\to\nu)=\left\{\begin{array}{rc} e^{\frac{-\Delta E}{k_BT}}, \quad \text{se}\quad \Delta E&amp;gt;0\\&lt;br /&gt;
1, \quad \text{caso contrario}\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, inicialmente foram feitas algumas alterações no algoritmo de Kawasaki. Limita-se a troca de valores somente entre um sítio e seus quatro vizinhos principais (isto é, acima, abaixo, à direita e à esquerda). Isso porque se tinha a intenção de recriar o comportamento difusivo de um gás no modelo do gás de rede em duas dimensões, porém, essa escolha para a dinâmica das simulações limita em muito a facilidade do sistema equilibrar, como será mostrado na parte de resultados. O algoritmo inicial consiste na seguinte ideia: No estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, seleciona-se aleatoriamente um sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. A partir dele, é sorteado um de seus vizinhos, digamos, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, com o qual haverá a troca de valor. Antes que ocorra a troca, são calculados os valores de dois Hamiltonianos: o que relaciona o sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; com seus vizinhos e o que relaciona &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; com seus vizinhos. Somados, eles representam o valor de &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt;. Após a troca, esses valores são recalculados, formando o valor de &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt;. Com esses valores, segue-se o cálculo da probabilidade da forma usual. &lt;br /&gt;
&lt;br /&gt;
Após verificar que a dinâmica inicialmente escolhida não era apropriada, optou-se por usar o algoritmo de Kawasaki tradicional, fazendo uso de uma listagem de quais eram os estados dos sítios e escolhendo os pares a serem trocados sempre como sítios de estados diferentes. Isso faz com que a aceitação do algoritmo de Monte Carlo seja muito mais elevada que ao do nosso algoritmo inicial, pois no caso em que grandes clusters são formados as trocas eram sempre rejeitadas de acordo com a dinâmica inicial.&lt;br /&gt;
&lt;br /&gt;
===Considerações práticas===&lt;br /&gt;
&lt;br /&gt;
Já consideramos os aspectos iniciais do método de Monte Carlo, mostrando suas aplicações. Vimos, do mesmo modo, a utilização do algoritmo de Metrópolis, dentro do qual aplicamos o algoritmo de Kawasaki (modificado) para desenvolver o sistema do gás de rede. Resta elucidar a função do parâmetro temporal, isto é, como as iterações desses algoritmos influenciam o sistema. Primeiramente, deve-se fixar um valor para o número de passos temporais que serão realizados. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações  do algoritmo de Metrópolis, abordado acima, sendo &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; o lado da rede quadrada. Chamamos de Passo de Monte Carlo (MCS) cada um desses passos temporais. Em outras palavras: em cada passo de Monte Carlo, todos os sítios tem a possibilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
=== Eficiência da dinâmica local ===&lt;br /&gt;
&lt;br /&gt;
Como mencionado acima, a primeira dinâmica escolhida foi a que restringe os sítios a trocarem de estado para apenas aqueles que são vizinhos próximos (os 4 acima, abaixo, a direita e a esquerda). Se verificou ao analisar os dados das simulações que na verdade essa dinâmica não era apropriada, pois a aceitação do algoritmo é muito baixa e com a amostragem escolhida (&amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS) o sistema ainda não estaria equilibrado. Isso pode ser percebido mais facilmente observando os histogramas das simulações. Sabe-se que a distribuição das grandezas macroscópicas de um sistema termodinâmico é a distribuição de Boltzmann &amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, então se espera para o sistema analisado que a energia tenha uma distribuição normal de frequências. Observe a diferença entre as distribuições para a energia do sistema no caso da dinâmica local inicialmente escolhida e no caso do algoritmo tradicional de Kawasaki:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Diferença entre distribuições para a energia do sistema por dinâmica escolhida.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Assim podemos notar que o sistema não está equilibrado após a amostragem com a dinâmica local. No caso do algoritmo tradicional o sistema se encontra em equilíbrio. Para temperaturas mais altas, acima da temperatura crítica para cada modelo onde não há mais separação de fase, a dinâmica tem eficiência satisfatória, pois a aceitação do algoritmo de Monte Carlo é maior já que sem a formação de grandes clusters a probabilidade de uma partícula ser selecionada e poder trocar para um sítio vazio que seja seu vizinho é muito maior. Contudo, ainda assim é mais vantajoso executar as simulações na linguagem de Ising, já que a aceitação do algoritmo ainda é maior do que para a dinâmica local proposta, então a quantidade de dados descorrelacionados para a mesma amostragem de &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS é maior. Dessa maneira, para uma amostragem de mesmo tamanho, o valor estimado para uma grandeza &amp;lt;math&amp;gt;\langle Q \rangle&amp;lt;/math&amp;gt; é mais preciso no caso da dinâmica proposta pelo algoritmo de Kawasaki, e para uma mesma precisão no valor estimado seria necessária uma amostragem menor do que a da dinâmica local.&lt;br /&gt;
A referência na qual esse trabalho mais se inspira, Monte Carlo Methods in Statistical Physics, de Newman e Barkema, não dá a devida ênfase para quão interessante computacionalmente é se manter na linguagem do modelo de Ising e adotar o algoritmo de Kawasaki.&lt;br /&gt;
É importante notar que as simulações da dinâmica de Kawasaki foram feitas na linguagem do modelo de Ising, com spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, ao invés de sítios ocupados por partículas &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; e sítios desocupados &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Essa mudança é importante para entender a mudança na escala das grandezas entre as simulações. Como a constante de interação &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; do modelo de Ising é um quarto da constante &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, a temperatura e a energia no modelo de Ising valem &amp;lt;math&amp;gt;\frac{1}{4}&amp;lt;/math&amp;gt; da temperatura e da energia nas simulações com a dinâmica local na linguagem do gás de rede.&lt;br /&gt;
&lt;br /&gt;
=== Separação de fases ===&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:sep_fases.gif|thumb|center|none|alt=Alt text|Animação ilustrando a separação de fases no modelo de Ising com magnetização constante. Note como ocorre a formação de clusters.|480px]]&lt;br /&gt;
&lt;br /&gt;
=== Energia e efeito do tamanho da rede ===&lt;br /&gt;
&lt;br /&gt;
A grandeza que foi medida nas simulações é a energia total do sistema. Para analisar os efeitos do tamanho da rede devemos comparar os valores das energias por número de sítios, já que quanto maior a rede maior o número de partículas e portanto maior o valor absoluto da energia. Abaixo temos um gráfico com os valores da energia total do sistema por número de sítios em função da temperatura, com os dados das três redes simuladas (L = 16, 32, 64).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:energia.png|thumb|center|none|alt=Alt text|Energia total do sistema dividida pelo número de sítios em função da temperatura para redes de tamanhos diferentes. Cada ponto no gráfico é a média de 5 amostragens com seu desvio padrão.|480px]]&lt;br /&gt;
&lt;br /&gt;
Aqui o comportamento da energia é como esperado para o modelo. Há uma queda no valor da energia conforme a temperatura do reservatório diminui abaixo da temperatura crítica, e conforme a temperatura aumenta acima da temperatura crítica, a energia aumenta mais devagar dado que é o estado em que o sistema está na sua fase amorfa.&lt;br /&gt;
&lt;br /&gt;
Algo que se nota no gráfico acima é a diferença nos valores da energia das redes &amp;lt;math&amp;gt;L = 32&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. É perceptível que as duas redes maiores apresentam valores de energia muito mais próximos. Isso se dá justamente pelo tamanho da rede e o fato da densidade ser a mesma.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Ilustração dos estados de menor energia&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:rede16.png|thumb|center|upright=4|none|alt= Alt text|Diagrama ilustrando o estado de menor energia para a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. As cores indicam o número de sítios vizinhos ocupados.|480px]]&lt;br /&gt;
|[[Arquivo:diagrama.gif|thumb|upright=4|none|alt=Alt text|Animação ilustrando o número de partículas internas ao cluster se tornando mais relevante que o número de partículas nas bordas conforme a rede aumenta.|500px]]&lt;br /&gt;
&lt;br /&gt;
Para entender como o valor da energia total do sistema por número de sítios varia com o tamanho da rede é interessante calcular essa grandeza no estado de menor energia. No caso da rede quadrada, o estado de menor energia é um cluster quadrado. Como ilustrado no diagrama acima, existem sítios com 3 vizinhos ocupados e sítios com 2 vizinhos ocupados. Estes são os da borda do cluster. Todos os outros internos ao cluster tem 4 vizinhos ocupados e portanto contribuem com &amp;lt;math&amp;gt;-4\epsilon&amp;lt;/math&amp;gt; para o Hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
Nesse trabalho adotamos &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt;, o que facilita o cálculo da energia total, pois o tamanho do lado do cluster é &amp;lt;math&amp;gt; l = \sqrt{\frac{L^2}{4}}&amp;lt;/math&amp;gt;. Temos &amp;lt;math&amp;gt;(l - 2)^2&amp;lt;/math&amp;gt; partículas internas ao cluster e portanto com 4 vizinhos e &amp;lt;math&amp;gt;4(l - 2)&amp;lt;/math&amp;gt; partículas nas bordas com 3 vizinhos. O Hamiltoniano é portanto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = (-2\epsilon)4 + (-3\epsilon)4(l - 2) + (-4\epsilon)(l - 2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O primeiro termo é a referente às interações dos 4 cantos do cluster, que tem apenas 2 vizinhos ocupados. Abrindo os termos e simplificando a equação chegamos ao valor do Hamiltoniano do estado de menor energia do gás de rede:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = -(L^2 - 2L)\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo por 2 para encontrar o valor da energia total e então por &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;e = \frac{E}{L^2} = - \frac{\epsilon}{2} + \frac{\epsilon}{L}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
que é a grandeza apresentada no gráfico anterior. Essa elaboração foi feita para o modelo do gás de rede, porém as simulações foram feitas com o modelo de Ising, com a restrição de que a magnetização era constante (a quantidade de spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é constante).&lt;br /&gt;
&lt;br /&gt;
Usando a equação &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;J = \frac{\epsilon}{4}&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J\sum{i}s_i - 4JL^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utilizamos então a equação &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt; e percebemos que os termos do meio e da direita se cancelam, deixando somente o primeiro termo para avaliarmos em termos do estado de menor energia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J(2\rho - 1)L^2 - 4JL^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; = -J\sum_{\langle i, j \rangle}s_i s_j &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora podemos avaliar o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições. Para isso podemos nos basear no diagrama usado anteriormente, com a ressalva de que os sítios imediatamente fora do cluster também interagem com ele, já que temos agora spins &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; ao invés de sítios vazios. Temos o mesmo número de spins internos ao cluster que de pariculas anteriormente, assim como para as bordas do cluster e os mesmos quatro cantos. Além disso, os sítios fora do cluster também tem contribuição para o Hamiltoniano. O número de spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;L^2 - \frac{L^2}{4} - 2L&amp;lt;/math&amp;gt; e o número de spins fora do cluster com 1 vizinho &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;2L&amp;lt;/math&amp;gt;. Agora podemos somar todas essas contribuições.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = (-4J)(L^2 - \frac{L^2}{4} - 2L) + (-2J)(2L) + (-2J)4(\frac{L}{2} - 2) + (-4J)(\frac{L}{2} - 2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da esquerda para a direita os termos são a contribuição dos spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, dos spins fora do cluster mas com um vizinho no cluster, dos spins na borda do cluster e dos spins interiores ao cluster. Abrindo os termos e simplificando a equação chegamos finalmente em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -(4L^2 - 8L)J&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E como nas simulações foram utilizadas que &amp;lt;math&amp;gt;\epsilon = 1&amp;lt;/math&amp;gt; para o caso do gás de rede e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt; para o modelo de Ising, temos portanto que as energias medidas com o modelo de Ising são equivalentes a 4 vezes as energias no modelo do gás de rede, como se verificou ao implementar a mesma função de medida para a linguagem de spins e de sítios vazios e ocupados. E com essa equação para o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições podemos perceber que o efeito do tamanho de rede é praticamente o mesmo, com a ressalva de que a energia por sítio deve ser também 4 vezes a energia por sítio do modelo do gás de rede.&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
&lt;br /&gt;
Passamos pelo que vem a ser o modelo do gás de rede na rede quadrada e apresentamos sua relação com o modelo de Ising. O Hamiltoniano do modelo do gás de rede nos mostra que ele é idêntico ao modelo de Ising com um termo de campo magnético externo. Ao fixarmos a densidade do modelo do gás de rede, impomos a restrição de que o modelo de Ising deve ter a magnetização constante para mantermos a equivalência. Também se discutiu o efeito do tamanho das redes simuladas e vimos que quanto maior o tamanho da rede mais próximo será o valor das energias por sítio em comparação com redes de tamanhos similares e vimos que isso se deve pelo fato do número de sítios no cluster do estado de menor energia crescer mais rápido no interior do cluster do que em seu perímetro.&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é a temperatura do banho térmico e o terceiro é a semente utilizada pelo gerador de números pseudo-aleatórios. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DGNU prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede com Densidade Constante e dinâmica local]]&lt;br /&gt;
&lt;br /&gt;
[[Modelo de ising com magnetização constante e algoritmo de Kawasaki]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Sep_fases.gif&amp;diff=3111</id>
		<title>Arquivo:Sep fases.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Sep_fases.gif&amp;diff=3111"/>
		<updated>2020-11-27T06:28:57Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3110</id>
		<title>Gás de Rede 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3110"/>
		<updated>2020-11-27T06:15:05Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &lt;br /&gt;
Este trabalho tem o intuito de apresentar uma descrição do modelo do Gás de Rede bidimensional e traçar paralelos com o modelo de Ising, discutindo a relação entre seus Hamiltonianos.&lt;br /&gt;
&lt;br /&gt;
== Gás de Rede ==&lt;br /&gt;
&lt;br /&gt;
O Modelo do Gás de Rede 2D consiste em um sistema de &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas da forma &amp;lt;math&amp;gt;\sigma = {\sigma_1, \sigma_1, \dotsc, \sigma_N}&amp;lt;/math&amp;gt; onde cada sítio da rede pode assumir o valor &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, ocupado por uma partícula, ou &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;, não ocupado por uma partícula. A energia total do sistema é dada pelo Hamiltoniano do Gás de Rede, descrito pela equação&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \epsilon \sum_{\langle i,j \rangle} \sigma_i \sigma_j \qquad (1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde o somatório é dado entre os quatro vizinhos mais próximos e &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; é a constante de interação entre as partículas, para &amp;lt;math&amp;gt;\epsilon \geq 0&amp;lt;/math&amp;gt; a interação é atrativa. Por se tratar de uma rede quadrada com &amp;lt;math&amp;gt;L^2 = L \times L&amp;lt;/math&amp;gt; sítios, apenas uma parcela da rede é ocupada por partículas, ou seja, possuímos uma densidade constante &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; de partículas. Podemos expressar a condição da densidade constante da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} \sigma_i = \rho L^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazendo uma mudança de variáveis da forma &amp;lt;math&amp;gt;s_i = 2 \sigma_i - 1&amp;lt;/math&amp;gt; saímos da situação de ocupação e não ocupação de sítios e obtemos variáveis do Modelo de Ising &amp;lt;ref name=ISING&amp;gt; https://fiscomp.if.ufrgs.br/index.php/Ising_2D&amp;lt;/ref&amp;gt;, spins Up e Down. A variável &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; assume valor &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; (up) quando o sítio esta ocupado por uma partícula e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; quando não está. Aplicando a mudança de variáveis no Hamiltoniano do Gás de Rede obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} (s_i + 1)(s_j + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}[s_i s_j + s_i + s_j + 1]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Abrindo os termos dos três últimos somatórios se encontra que&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle}s_i = \sum_{\langle i,j \rangle}s_j = z \sum_{i}s_i&amp;lt;/math&amp;gt;, e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle} 1 = z L^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
o que simplifica a expressão para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{2} \epsilon z \sum_{i} s_i - \frac{1}{4} \epsilon z L^2 \qquad (2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; é o número de coordenação, isto é, o número de vizinhos de cada sítio, que para a rede quadrada é 4. Note a mudança no índice do somatório de &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Vemos que este Hamiltoniano possui a forma do Hamiltoniano do modelo de Ising com aplicação de um campo magnético externo, a menos de uma constante. Entretanto, com a densidade constante, fazendo a mesma mudança de variáveis, obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} s_i = (2\rho - 1) L^2 \qquad (3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicando essa relação no Hamiltoniano obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} s_i s_j - z \epsilon L^2 \rho  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; são constantes, o segundo termo é constante. Definindo &amp;lt;math&amp;gt;J = \epsilon / 4&amp;lt;/math&amp;gt; o Hamiltoniano se torna&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - J \sum_{\langle i,j \rangle} s_i s_j + \text{constante}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A constante não influencia nos valores da medida, pois ela se cancela na equação de mudança de estado &amp;lt;ref name=BARKEMA&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;. Vemos que, ao assumir a densidade constante, o modelo do Gás de Rede se torna o modelo de Ising sem a presença de um campo magnético. A condição da densidade constante é a magnetização total do modelo. &lt;br /&gt;
&lt;br /&gt;
É interessante notar que podemos tratar o modelo do gás de rede de duas formas: &#039;&#039;&#039;(a)&#039;&#039;&#039; assumir a densidade constante e utilizar o primeiro Hamiltoniano apresentado, ou &#039;&#039;&#039;(b)&#039;&#039;&#039; não assumir a densidade constante, aplicar a mudança de variáveis discutida e utilizar o Hamiltoniano que possuí a forma de Ising com campo magnético.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Método de Monte Carlo==&lt;br /&gt;
&lt;br /&gt;
===Princípios gerais===&lt;br /&gt;
&lt;br /&gt;
Para desenvolver a dinâmica do gás de rede, isto é, fazer com que ocorram alterações na posição das partículas, recorre-se ao método de Monte Carlo. Trata-se, em linhas gerais, de um método estatístico baseado em amostragem aleatória. É comum, ao introduzir-se o assunto, utilizar problemas de cálculo de áreas, como, por exemplo, a clássica história das crianças que desenharam, na areia, um círculo contido em um quadrado, de modo que o diâmetro do círculo seja igual ao lado do quadrado. Jogam, aleatoriamente, pedras no quadrado. Após uma grande quantidade de arremessos, compara-se o valor de pedras que estão dentro do círculo com o número total dentro do quadrado, fazendo a razão entre esses dois valores, encontra-se uma aproximação para a razão entre a área do círculo e a do quadrado, que equivale a &amp;lt;math&amp;gt;\pi/4&amp;lt;/math&amp;gt;. Desse modo, pode ser encontrada uma aproximação do valor de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; através do método de Monte Carlo, que simula uma aproximação experimental&amp;lt;ref name=KRAUTH&amp;gt;Krauth ,W. ,&amp;quot;Statistical Mechanics: Algorithms and Computations&amp;quot;. Oxford Master Series in Physics, Oxford University Press, 2006.&amp;lt;/ref&amp;gt;. É possível propor um novo modelo, no qual o quadrado é grande e as pedras são atiradas aleatoriamente de dentro do quadrado, de modo que a posição de arremesso é atualizada para a posição da última pedra jogada. A principal alteração nesse método é a possibilidade de que uma pedra seja atirada para fora do quadrado. Nesse caso, a posição para o próximo arremesso não muda e as pedras que foram parar fora das bordas do quadrado são empilhadas naquela posição. Essas mudanças no método caracterizam a aplicação de Monte Carlo em uma cadeia de Markov, definida de modo que a configuração do próximo estado depende somente da configuração atual. Até aqui, vimos o método de Monte Carlo aplicado em situações nas quais a probabilidade de um evento ocorrer na configuração subsequente do sistema é zero ou um. Para novas distribuições de probabilidade, utiliza-se o algoritmo de Metrópolis.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo de Metrópolis===&lt;br /&gt;
&lt;br /&gt;
Como mencionado, o método de Monte Carlo funciona através de atualizações em um sistema, fazendo com que ele passe de um estado para outro. Consideremos &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; como sendo o estado atual do sistema. O próximo estado será chamado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Chamamos a probabilidade do sistema passar do estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt;. A ideia do algoritmo de Metrópolis é aplicar essa probabilidade no método de Monte Carlo. Para isso, um método muito utilizado é calcular a probabilidade &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt; e compará-la a um número aleatório &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, de modo que &amp;lt;math&amp;gt;0&amp;lt;r&amp;lt;1&amp;lt;/math&amp;gt;. Se &amp;lt;math&amp;gt; p(\mu\to\nu)&amp;gt;r&amp;lt;/math&amp;gt;, então o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é adotado pelo sistema. Para aplicar essas ideias ao problema do gás de rede, o método mais simples é utilizando o algoritmo de Kawasaki, que faz com que dois sítios, selecionados aleatoriamente, tenham seus valores trocados. Isso implica que a magnetização do sistema será constante&amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;. Para calcular a probabilidade de aceitação dessa mudança, calcula-se a variação de energia entre os estados,&amp;lt;math&amp;gt;\Delta E= E_{\nu}-E_{\mu}&amp;lt;/math&amp;gt;, e aplica-se o valor obtido na equação de probabilidade de aceitação de Metrópolis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\mu\to\nu)=\left\{\begin{array}{rc} e^{\frac{-\Delta E}{k_BT}}, \quad \text{se}\quad \Delta E&amp;gt;0\\&lt;br /&gt;
1, \quad \text{caso contrario}\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, inicialmente foram feitas algumas alterações no algoritmo de Kawasaki. Limita-se a troca de valores somente entre um sítio e seus quatro vizinhos principais (isto é, acima, abaixo, à direita e à esquerda). Isso porque se tinha a intenção de recriar o comportamento difusivo de um gás no modelo do gás de rede em duas dimensões, porém, essa escolha para a dinâmica das simulações limita em muito a facilidade do sistema equilibrar, como será mostrado na parte de resultados. O algoritmo inicial consiste na seguinte ideia: No estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, seleciona-se aleatoriamente um sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. A partir dele, é sorteado um de seus vizinhos, digamos, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, com o qual haverá a troca de valor. Antes que ocorra a troca, são calculados os valores de dois Hamiltonianos: o que relaciona o sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; com seus vizinhos e o que relaciona &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; com seus vizinhos. Somados, eles representam o valor de &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt;. Após a troca, esses valores são recalculados, formando o valor de &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt;. Com esses valores, segue-se o cálculo da probabilidade da forma usual. &lt;br /&gt;
&lt;br /&gt;
Após verificar que a dinâmica inicialmente escolhida não era apropriada, optou-se por usar o algoritmo de Kawasaki tradicional, fazendo uso de uma listagem de quais eram os estados dos sítios e escolhendo os pares a serem trocados sempre como sítios de estados diferentes. Isso faz com que a aceitação do algoritmo de Monte Carlo seja muito mais elevada que ao do nosso algoritmo inicial, pois no caso em que grandes clusters são formados as trocas eram sempre rejeitadas de acordo com a dinâmica inicial.&lt;br /&gt;
&lt;br /&gt;
===Considerações práticas===&lt;br /&gt;
&lt;br /&gt;
Já consideramos os aspectos iniciais do método de Monte Carlo, mostrando suas aplicações. Vimos, do mesmo modo, a utilização do algoritmo de Metrópolis, dentro do qual aplicamos o algoritmo de Kawasaki (modificado) para desenvolver o sistema do gás de rede. Resta elucidar a função do parâmetro temporal, isto é, como as iterações desses algoritmos influenciam o sistema. Primeiramente, deve-se fixar um valor para o número de passos temporais que serão realizados. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações  do algoritmo de Metrópolis, abordado acima, sendo &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; o lado da rede quadrada. Chamamos de Passo de Monte Carlo (MCS) cada um desses passos temporais. Em outras palavras: em cada passo de Monte Carlo, todos os sítios tem a possibilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
=== Eficiência da dinâmica local ===&lt;br /&gt;
&lt;br /&gt;
Como mencionado acima, a primeira dinâmica escolhida foi a que restringe os sítios a trocarem de estado para apenas aqueles que são vizinhos próximos (os 4 acima, abaixo, a direita e a esquerda). Se verificou ao analisar os dados das simulações que na verdade essa dinâmica não era apropriada, pois a aceitação do algoritmo é muito baixa e com a amostragem escolhida (&amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS) o sistema ainda não estaria equilibrado. Isso pode ser percebido mais facilmente observando os histogramas das simulações. Sabe-se que a distribuição das grandezas macroscópicas de um sistema termodinâmico é a distribuição de Boltzmann &amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, então se espera para o sistema analisado que a energia tenha uma distribuição normal de frequências. Observe a diferença entre as distribuições para a energia do sistema no caso da dinâmica local inicialmente escolhida e no caso do algoritmo tradicional de Kawasaki:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Diferença entre distribuições para a energia do sistema por dinâmica escolhida.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Assim podemos notar que o sistema não está equilibrado após a amostragem com a dinâmica local. No caso do algoritmo tradicional o sistema se encontra em equilíbrio. Para temperaturas mais altas, acima da temperatura crítica para cada modelo onde não há mais separação de fase, a dinâmica tem eficiência satisfatória, pois a aceitação do algoritmo de Monte Carlo é maior já que sem a formação de grandes clusters a probabilidade de uma partícula ser selecionada e poder trocar para um sítio vazio que seja seu vizinho é muito maior. Contudo, ainda assim é mais vantajoso executar as simulações na linguagem de Ising, já que a aceitação do algoritmo ainda é maior do que para a dinâmica local proposta, então a quantidade de dados descorrelacionados para a mesma amostragem de &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS é maior. Dessa maneira, para uma amostragem de mesmo tamanho, o valor estimado para uma grandeza &amp;lt;math&amp;gt;\langle Q \rangle&amp;lt;/math&amp;gt; é mais preciso no caso da dinâmica proposta pelo algoritmo de Kawasaki, e para uma mesma precisão no valor estimado seria necessária uma amostragem menor do que a da dinâmica local.&lt;br /&gt;
A referência na qual esse trabalho mais se inspira, Monte Carlo Methods in Statistical Physics, de Newman e Barkema, não dá a devida ênfase para quão interessante computacionalmente é se manter na linguagem do modelo de Ising e adotar o algoritmo de Kawasaki.&lt;br /&gt;
É importante notar que as simulações da dinâmica de Kawasaki foram feitas na linguagem do modelo de Ising, com spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, ao invés de sítios ocupados por partículas &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; e sítios desocupados &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Essa mudança é importante para entender a mudança na escala das grandezas entre as simulações. Como a constante de interação &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; do modelo de Ising é um quarto da constante &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, a temperatura e a energia no modelo de Ising valem &amp;lt;math&amp;gt;\frac{1}{4}&amp;lt;/math&amp;gt; da temperatura e da energia nas simulações com a dinâmica local na linguagem do gás de rede.&lt;br /&gt;
&lt;br /&gt;
=== Separação de fases ===&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:sep_fases.gif|thumb|center|none|alt=Alt text|Animação ilustrando a separação de fases no modelo de Ising com magnetização constante. Note como ocorre a formação de clusters.|480px]]&lt;br /&gt;
&lt;br /&gt;
=== Energia e efeito do tamanho da rede ===&lt;br /&gt;
&lt;br /&gt;
A grandeza que foi medida nas simulações é a energia total do sistema. Para analisar os efeitos do tamanho da rede devemos comparar os valores das energias por número de sítios, já que quanto maior a rede maior o número de partículas e portanto maior o valor absoluto da energia. Abaixo temos um gráfico com os valores da energia total do sistema por número de sítios em função da temperatura, com os dados das três redes simuladas (L = 16, 32, 64).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:energia.png|thumb|center|none|alt=Alt text|Energia total do sistema dividida pelo número de sítios em função da temperatura para redes de tamanhos diferentes. Cada ponto no gráfico é a média de 5 amostragens com seu desvio padrão.|480px]]&lt;br /&gt;
&lt;br /&gt;
Aqui o comportamento da energia é como esperado para o modelo. Há uma queda no valor da energia conforme a temperatura do reservatório diminui abaixo da temperatura crítica, e conforme a temperatura aumenta acima da temperatura crítica, a energia aumenta mais devagar dado que é o estado em que o sistema está na sua fase amorfa.&lt;br /&gt;
&lt;br /&gt;
Algo que se nota no gráfico acima é a diferença nos valores da energia das redes &amp;lt;math&amp;gt;L = 32&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. É perceptível que as duas redes maiores apresentam valores de energia muito mais próximos. Isso se dá justamente pelo tamanho da rede e o fato da densidade ser a mesma.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:rede16.png|thumb|center|upright=4|none|alt= Alt text|Diagrama ilustrando o estado de menor energia para a rede de 16. As cores indicam o número de sítios vizinhos ocupados.|480px]]&lt;br /&gt;
&lt;br /&gt;
Para entender como o valor da energia total do sistema por número de sítios varia com o tamanho da rede é interessante calcular essa grandeza no estado de menor energia. No caso da rede quadrada, o estado de menor energia é um cluster quadrado. Como ilustrado no diagrama acima, existem sítios com 3 vizinhos ocupados e sítios com 2 vizinhos ocupados. Estes são os da borda do cluster. Todos os outros internos ao cluster tem 4 vizinhos ocupados e portanto contribuem com &amp;lt;math&amp;gt;-4\epsilon&amp;lt;/math&amp;gt; para o Hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
Nesse trabalho adotamos &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt;, o que facilita o cálculo da energia total, pois o tamanho do lado do cluster é &amp;lt;math&amp;gt; l = \sqrt{\frac{L^2}{4}}&amp;lt;/math&amp;gt;. Temos &amp;lt;math&amp;gt;(l - 2)^2&amp;lt;/math&amp;gt; partículas internas ao cluster e portanto com 4 vizinhos e &amp;lt;math&amp;gt;4(l - 2)&amp;lt;/math&amp;gt; partículas nas bordas com 3 vizinhos. O Hamiltoniano é portanto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = (-2\epsilon)*4 + (-3\epsilon)*4(l - 2) + (-4\epsilon)(l - 2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O primeiro termo é a referente às interações dos 4 cantos do cluster, que tem apenas 2 vizinhos ocupados. Abrindo os termos e simplificando a equação chegamos ao valor do Hamiltoniano do estado de menor energia do gás de rede:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = -(L^2 - 2L)\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo por 2 para encontrar o valor da energia total e então por &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;e = \frac{E}{L^2} = - \frac{\epsilon}{2} + \frac{\epsilon}{L}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
que é a grandeza apresentada no gráfico anterior. Essa elaboração foi feita para o modelo do gás de rede, porém as simulações foram feitas com o modelo de Ising, com a restrição de que a magnetização era constante (a quantidade de spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é constante).&lt;br /&gt;
&lt;br /&gt;
Usando a equação &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;J = \frac{\epsilon}{4}&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J\sum{i}s_i - 4JL^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utilizamos então a equação &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt; e percebemos que os termos do meio e da direita se cancelam, deixando somente o primeiro termo para avaliarmos em termos do estado de menor energia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J(2\rho - 1)L^2 - 4JL^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; = -J\sum_{\langle i, j \rangle}s_i s_j &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora podemos avaliar o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições. Para isso podemos nos basear no diagrama usado anteriormente, com a ressalva de que os sítios imediatamente fora do cluster também interagem com ele, já que temos agora spins &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; ao invés de sítios vazios. Temos o mesmo número de spins internos ao cluster que de pariculas anteriormente, assim como para as bordas do cluster e os mesmos quatro cantos. Além disso, os sítios fora do cluster também tem contribuição para o Hamiltoniano. O número de spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;L^2 - \frac{L^2}{4} - 2L&amp;lt;/math&amp;gt; e o número de spins fora do cluster com 1 vizinho &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;2L&amp;lt;/math&amp;gt;. Agora podemos somar todas essas contribuições.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = (-4J)(L^2 - \frac{L^2}{4} - 2L) + (-2J)(2L) + (-2J)*4(\frac{L}{2} - 2) + (-4J)(\frac{L}{2} - 2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da esquerda para a direita os termos são a contribuição dos spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, dos spins fora do cluster mas com um vizinho no cluster, dos spins na borda do cluster e dos spins interiores ao cluster. Abrindo os termos e simplificando a equação chegamos finalmente em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -(4L^2 - 8L)J&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E como nas simulações foram utilizadas que &amp;lt;math&amp;gt;\epsilon = 1&amp;lt;/math&amp;gt; para o caso do gás de rede e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt; para o modelo de Ising, temos portanto que as energias medidas com o modelo de Ising são equivalentes a 4 vezes as energias no modelo do gás de rede, como se verificou ao implementar a mesma função de medida para a linguagem de spins e de sítios vazios e ocupados. E com essa equação para o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições podemos perceber que o efeito do tamanho de rede é praticamente o mesmo, com a ressalva de que a energia por sítio deve ser também 4 vezes a energia por sítio do modelo do gás de rede.&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
&lt;br /&gt;
Passamos pelo que vem a ser o modelo do gás de rede na rede quadrada e apresentamos sua relação com o modelo de Ising. O Hamiltoniano do modelo do gás de rede nos mostra que ele é idêntico ao modelo de Ising com um termo de campo magnético externo. Ao fixarmos a densidade do modelo do gás de rede, impomos a restrição de que o modelo de Ising deve ter a magnetização constante para mantermos a equivalência. Também se discutiu o efeito do tamanho das redes simuladas e vimos que quanto maior o tamanho da rede mais próximo será o valor das energias por sítio em comparação com redes de tamanhos similares e vimos que isso se deve pelo fato do número de sítios no cluster do estado de menor energia crescer mais rápido no interior do cluster do que em seu perímetro.&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é a temperatura do banho térmico e o terceiro é a semente utilizada pelo gerador de números pseudo-aleatórios. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DGNU prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede com Densidade Constante e dinâmica local]]&lt;br /&gt;
&lt;br /&gt;
[[Modelo de ising com magnetização constante e algoritmo de Kawasaki]]&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca com funções em C para simulações de Monte Carlo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3109</id>
		<title>Gás de Rede 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3109"/>
		<updated>2020-11-27T01:30:19Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &lt;br /&gt;
Este trabalho tem o intuito de apresentar uma descrição do modelo do Gás de Rede bidimensional e traçar paralelos com o modelo de Ising, discutindo a relação entre seus Hamiltonianos.&lt;br /&gt;
&lt;br /&gt;
== Gás de Rede ==&lt;br /&gt;
&lt;br /&gt;
O Modelo do Gás de Rede 2D consiste em um sistema de &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas da forma &amp;lt;math&amp;gt;\sigma = {\sigma_1, \sigma_1, \dotsc, \sigma_N}&amp;lt;/math&amp;gt; onde cada sítio da rede pode assumir o valor &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, ocupado por uma partícula, ou &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;, não ocupado por uma partícula. A energia total do sistema é dada pelo Hamiltoniano do Gás de Rede, descrito pela equação&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \epsilon \sum_{\langle i,j \rangle} \sigma_i \sigma_j \qquad (1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde o somatório é dado entre os quatro vizinhos mais próximos e &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; é a constante de interação entre as partículas, para &amp;lt;math&amp;gt;\epsilon \geq 0&amp;lt;/math&amp;gt; a interação é atrativa. Por se tratar de uma rede quadrada com &amp;lt;math&amp;gt;L^2 = L \times L&amp;lt;/math&amp;gt; sítios, apenas uma parcela da rede é ocupada por partículas, ou seja, possuímos uma densidade constante &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; de partículas. Podemos expressar a condição da densidade constante da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} \sigma_i = \rho L^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazendo uma mudança de variáveis da forma &amp;lt;math&amp;gt;s_i = 2 \sigma_i - 1&amp;lt;/math&amp;gt; saímos da situação de ocupação e não ocupação de sítios e obtemos variáveis do Modelo de Ising &amp;lt;ref name=ISING&amp;gt; https://fiscomp.if.ufrgs.br/index.php/Ising_2D&amp;lt;/ref&amp;gt;, spins Up e Down. A variável &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; assume valor &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; (up) quando o sítio esta ocupado por uma partícula e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; quando não está. Aplicando a mudança de variáveis no Hamiltoniano do Gás de Rede obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} (s_i + 1)(s_j + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}[s_i s_j + s_i + s_j + 1]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Abrindo os termos dos três últimos somatórios se encontra que&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle}s_i = \sum_{\langle i,j \rangle}s_j = z \sum_{i}s_i&amp;lt;/math&amp;gt;, e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle} 1 = z L^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
o que simplifica a expressão para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{2} \epsilon z \sum_{i} s_i - \frac{1}{4} \epsilon z L^2 \qquad (2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; é o número de coordenação, isto é, o número de vizinhos de cada sítio, que para a rede quadrada é 4. Note a mudança no índice do somatório de &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Vemos que este Hamiltoniano possui a forma do Hamiltoniano do modelo de Ising com aplicação de um campo magnético externo, a menos de uma constante. Entretanto, com a densidade constante, fazendo a mesma mudança de variáveis, obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} s_i = (2\rho - 1) L^2 \qquad (3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicando essa relação no Hamiltoniano obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} s_i s_j - z \epsilon L^2 \rho  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; são constantes, o segundo termo é constante. Definindo &amp;lt;math&amp;gt;J = \epsilon / 4&amp;lt;/math&amp;gt; o Hamiltoniano se torna&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - J \sum_{\langle i,j \rangle} s_i s_j + \text{constante}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A constante não influencia nos valores da medida, pois ela se cancela na equação de mudança de estado &amp;lt;ref name=BARKEMA&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;. Vemos que, ao assumir a densidade constante, o modelo do Gás de Rede se torna o modelo de Ising sem a presença de um campo magnético. A condição da densidade constante é a magnetização total do modelo. &lt;br /&gt;
&lt;br /&gt;
É interessante notar que podemos tratar o modelo do gás de rede de duas formas: &#039;&#039;&#039;(a)&#039;&#039;&#039; assumir a densidade constante e utilizar o primeiro Hamiltoniano apresentado, ou &#039;&#039;&#039;(b)&#039;&#039;&#039; não assumir a densidade constante, aplicar a mudança de variáveis discutida e utilizar o Hamiltoniano que possuí a forma de Ising com campo magnético.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Método de Monte Carlo==&lt;br /&gt;
&lt;br /&gt;
===Princípios gerais===&lt;br /&gt;
&lt;br /&gt;
Para desenvolver a dinâmica do gás de rede, isto é, fazer com que ocorram alterações na posição das partículas, recorre-se ao método de Monte Carlo. Trata-se, em linhas gerais, de um método estatístico baseado em amostragem aleatória. É comum, ao introduzir-se o assunto, utilizar problemas de cálculo de áreas, como, por exemplo, a clássica história das crianças que desenharam, na areia, um círculo contido em um quadrado, de modo que o diâmetro do círculo seja igual ao lado do quadrado. Jogam, aleatoriamente, pedras no quadrado. Após uma grande quantidade de arremessos, compara-se o valor de pedras que estão dentro do círculo com o número total dentro do quadrado, fazendo a razão entre esses dois valores, encontra-se uma aproximação para a razão entre a área do círculo e a do quadrado, que equivale a &amp;lt;math&amp;gt;\pi/4&amp;lt;/math&amp;gt;. Desse modo, pode ser encontrada uma aproximação do valor de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; através do método de Monte Carlo, que simula uma aproximação experimental&amp;lt;ref name=KRAUTH&amp;gt;Krauth ,W. ,&amp;quot;Statistical Mechanics: Algorithms and Computations&amp;quot;. Oxford Master Series in Physics, Oxford University Press, 2006.&amp;lt;/ref&amp;gt;. É possível propor um novo modelo, no qual o quadrado é grande e as pedras são atiradas aleatoriamente de dentro do quadrado, de modo que a posição de arremesso é atualizada para a posição da última pedra jogada. A principal alteração nesse método é a possibilidade de que uma pedra seja atirada para fora do quadrado. Nesse caso, a posição para o próximo arremesso não muda e as pedras que foram parar fora das bordas do quadrado são empilhadas naquela posição. Essas mudanças no método caracterizam a aplicação de Monte Carlo em uma cadeia de Markov, definida de modo que a configuração do próximo estado depende somente da configuração atual. Até aqui, vimos o método de Monte Carlo aplicado em situações nas quais a probabilidade de um evento ocorrer na configuração subsequente do sistema é zero ou um. Para novas distribuições de probabilidade, utiliza-se o algoritmo de Metrópolis.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo de Metrópolis===&lt;br /&gt;
&lt;br /&gt;
Como mencionado, o método de Monte Carlo funciona através de atualizações em um sistema, fazendo com que ele passe de um estado para outro. Consideremos &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; como sendo o estado atual do sistema. O próximo estado será chamado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Chamamos a probabilidade do sistema passar do estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt;. A ideia do algoritmo de Metrópolis é aplicar essa probabilidade no método de Monte Carlo. Para isso, um método muito utilizado é calcular a probabilidade &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt; e compará-la a um número aleatório &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, de modo que &amp;lt;math&amp;gt;0&amp;lt;r&amp;lt;1&amp;lt;/math&amp;gt;. Se &amp;lt;math&amp;gt; p(\mu\to\nu)&amp;gt;r&amp;lt;/math&amp;gt;, então o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é adotado pelo sistema. Para aplicar essas ideias ao problema do gás de rede, o método mais simples é utilizando o algoritmo de Kawasaki, que faz com que dois sítios, selecionados aleatoriamente, tenham seus valores trocados. Isso implica que a magnetização do sistema será constante&amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;. Para calcular a probabilidade de aceitação dessa mudança, calcula-se a variação de energia entre os estados,&amp;lt;math&amp;gt;\Delta E= E_{\nu}-E_{\mu}&amp;lt;/math&amp;gt;, e aplica-se o valor obtido na equação de probabilidade de aceitação de Metrópolis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\mu\to\nu)=\left\{\begin{array}{rc} e^{\frac{-\Delta E}{k_BT}}, \quad \text{se}\quad \Delta E&amp;gt;0\\&lt;br /&gt;
1, \quad \text{caso contrario}\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, inicialmente foram feitas algumas alterações no algoritmo de Kawasaki. Limita-se a troca de valores somente entre um sítio e seus quatro vizinhos principais (isto é, acima, abaixo, à direita e à esquerda). Isso porque se tinha a intenção de recriar o comportamento difusivo de um gás no modelo do gás de rede em duas dimensões, porém, essa escolha para a dinâmica das simulações limita em muito a facilidade do sistema equilibrar, como será mostrado na parte de resultados. O algoritmo inicial consiste na seguinte ideia: No estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, seleciona-se aleatoriamente um sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. A partir dele, é sorteado um de seus vizinhos, digamos, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, com o qual haverá a troca de valor. Antes que ocorra a troca, são calculados os valores de dois Hamiltonianos: o que relaciona o sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; com seus vizinhos e o que relaciona &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; com seus vizinhos. Somados, eles representam o valor de &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt;. Após a troca, esses valores são recalculados, formando o valor de &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt;. Com esses valores, segue-se o cálculo da probabilidade da forma usual. &lt;br /&gt;
&lt;br /&gt;
Após verificar que a dinâmica inicialmente escolhida não era apropriada, optou-se por usar o algoritmo de Kawasaki tradicional, fazendo uso de uma listagem de quais eram os estados dos sítios e escolhendo os pares a serem trocados sempre como sítios de estados diferentes. Isso faz com que a aceitação do algoritmo de Monte Carlo seja muito mais elevada que ao do nosso algoritmo inicial, pois no caso em que grandes clusters são formados as trocas eram sempre rejeitadas de acordo com a dinâmica inicial.&lt;br /&gt;
&lt;br /&gt;
===Considerações práticas===&lt;br /&gt;
&lt;br /&gt;
Já consideramos os aspectos iniciais do método de Monte Carlo, mostrando suas aplicações. Vimos, do mesmo modo, a utilização do algoritmo de Metrópolis, dentro do qual aplicamos o algoritmo de Kawasaki (modificado) para desenvolver o sistema do gás de rede. Resta elucidar a função do parâmetro temporal, isto é, como as iterações desses algoritmos influenciam o sistema. Primeiramente, deve-se fixar um valor para o número de passos temporais que serão realizados. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações  do algoritmo de Metrópolis, abordado acima, sendo &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; o lado da rede quadrada. Chamamos de Passo de Monte Carlo (MCS) cada um desses passos temporais. Em outras palavras: em cada passo de Monte Carlo, todos os sítios tem a possibilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
=== Eficiência da dinâmica local ===&lt;br /&gt;
&lt;br /&gt;
Como mencionado acima, a primeira dinâmica escolhida foi a que restringe os sítios a trocarem de estado para apenas aqueles que são vizinhos próximos (os 4 acima, abaixo, a direita e a esquerda). Se verificou ao analisar os dados das simulações que na verdade essa dinâmica não era apropriada, pois a aceitação do algoritmo é muito baixa e com a amostragem escolhida (&amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS) o sistema ainda não estaria equilibrado. Isso pode ser percebido mais facilmente observando os histogramas das simulações. Sabe-se que a distribuição das grandezas macroscópicas de um sistema termodinâmico é a distribuição de Boltzmann &amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, então se espera para o sistema analisado que a energia tenha uma distribuição normal de frequências. Observe a diferença entre as distribuições para a energia do sistema no caso da dinâmica local inicialmente escolhida e no caso do algoritmo tradicional de Kawasaki:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Diferença entre distribuições para a energia do sistema por dinâmica escolhida.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Assim podemos notar que o sistema não está equilibrado após a amostragem com a dinâmica local. No caso do algoritmo tradicional o sistema se encontra em equilíbrio. Para temperaturas mais altas, acima da temperatura crítica para cada modelo onde não há mais separação de fase, a dinâmica tem eficiência satisfatória, pois a aceitação do algoritmo de Monte Carlo é maior já que sem a formação de grandes clusters a probabilidade de uma partícula ser selecionada e poder trocar para um sítio vazio que seja seu vizinho é muito maior. Contudo, ainda assim é mais vantajoso executar as simulações na linguagem de Ising, já que a aceitação do algoritmo ainda é maior do que para a dinâmica local proposta, então a quantidade de dados descorrelacionados para a mesma amostragem de &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS é maior. Dessa maneira, para uma amostragem de mesmo tamanho, o valor estimado para uma grandeza &amp;lt;math&amp;gt;\langle Q \rangle&amp;lt;/math&amp;gt; é mais preciso no caso da dinâmica proposta pelo algoritmo de Kawasaki, e para uma mesma precisão no valor estimado seria necessária uma amostragem menor do que a da dinâmica local.&lt;br /&gt;
A referência na qual esse trabalho mais se inspira, Monte Carlo Methods in Statistical Physics, de Newman e Barkema, não dá a devida ênfase para quão interessante computacionalmente é se manter na linguagem do modelo de Ising e adotar o algoritmo de Kawasaki.&lt;br /&gt;
É importante notar que as simulações da dinâmica de Kawasaki foram feitas na linguagem do modelo de Ising, com spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, ao invés de sítios ocupados por partículas &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; e sítios desocupados &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Essa mudança é importante para entender a mudança na escala das grandezas entre as simulações. Como a constante de interação &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; do modelo de Ising é um quarto da constante &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, a temperatura e a energia no modelo de Ising valem &amp;lt;math&amp;gt;\frac{1}{4}&amp;lt;/math&amp;gt; da temperatura e da energia nas simulações com a dinâmica local na linguagem do gás de rede.&lt;br /&gt;
&lt;br /&gt;
=== Energia e efeito do tamanho da rede ===&lt;br /&gt;
&lt;br /&gt;
A grandeza que foi medida nas simulações é a energia total do sistema. Para analisar os efeitos do tamanho da rede devemos comparar os valores das energias por número de sítios, já que quanto maior a rede maior o número de partículas e portanto maior o valor absoluto da energia. Abaixo temos um gráfico com os valores da energia total do sistema por número de sítios em função da temperatura, com os dados das três redes simuladas (L = 16, 32, 64).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:energia.png|thumb|center|none|alt=Alt text|Energia total do sistema dividida pelo número de sítios em função da temperatura para redes de tamanhos diferentes. Cada ponto no gráfico é a média de 5 amostragens com seu desvio padrão.|480px]]&lt;br /&gt;
&lt;br /&gt;
Aqui o comportamento da energia é como esperado para o modelo. Há uma queda no valor da energia conforme a temperatura do reservatório diminui abaixo da temperatura crítica, e conforme a temperatura aumenta acima da temperatura crítica, a energia aumenta mais devagar dado que é o estado em que o sistema está na sua fase amorfa.&lt;br /&gt;
&lt;br /&gt;
Algo que se nota no gráfico acima é a diferença nos valores da energia das redes &amp;lt;math&amp;gt;L = 32&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. É perceptível que as duas redes maiores apresentam valores de energia muito mais próximos. Isso se dá justamente pelo tamanho da rede e o fato da densidade ser a mesma.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:rede16.png|thumb|center|upright=4|none|alt= Alt text|Diagrama ilustrando o estado de menor energia para a rede de 16. As cores indicam o número de sítios vizinhos ocupados.|480px]]&lt;br /&gt;
&lt;br /&gt;
Para entender como o valor da energia total do sistema por número de sítios varia com o tamanho da rede é interessante calcular essa grandeza no estado de menor energia. No caso da rede quadrada, o estado de menor energia é um cluster quadrado. Como ilustrado no diagrama acima, existem sítios com 3 vizinhos ocupados e sítios com 2 vizinhos ocupados. Estes são os da borda do cluster. Todos os outros internos ao cluster tem 4 vizinhos ocupados e portanto contribuem com &amp;lt;math&amp;gt;-4\epsilon&amp;lt;/math&amp;gt; para o Hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
Nesse trabalho adotamos &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt;, o que facilita o cálculo da energia total, pois o tamanho do lado do cluster é &amp;lt;math&amp;gt; l = \sqrt{\frac{L^2}{4}}&amp;lt;/math&amp;gt;. Temos &amp;lt;math&amp;gt;(l - 2)^2&amp;lt;/math&amp;gt; partículas internas ao cluster e portanto com 4 vizinhos e &amp;lt;math&amp;gt;4(l - 2)&amp;lt;/math&amp;gt; partículas nas bordas com 3 vizinhos. O Hamiltoniano é portanto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = (-2\epsilon)*4 + (-3\epsilon)*4(l - 2) + (-4\epsilon)(l - 2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O primeiro termo é a referente às interações dos 4 cantos do cluster, que tem apenas 2 vizinhos ocupados. Abrindo os termos e simplificando a equação chegamos ao valor do Hamiltoniano do estado de menor energia do gás de rede:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = -(L^2 - 2L)\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo por 2 para encontrar o valor da energia total e então por &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;e = \frac{E}{L^2} = - \frac{\epsilon}{2} + \frac{\epsilon}{L}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
que é a grandeza apresentada no gráfico anterior. Essa elaboração foi feita para o modelo do gás de rede, porém as simulações foram feitas com o modelo de Ising, com a restrição de que a magnetização era constante (a quantidade de spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é constante).&lt;br /&gt;
&lt;br /&gt;
Usando a equação &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;J = \frac{\epsilon}{4}&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J\sum{i}s_i - 4JL^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utilizamos então a equação &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt; e percebemos que os termos do meio e da direita se cancelam, deixando somente o primeiro termo para avaliarmos em termos do estado de menor energia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J(2\rho - 1)L^2 - 4JL^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; = -J\sum_{\langle i, j \rangle}s_i s_j &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora podemos avaliar o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições. Para isso podemos nos basear no diagrama usado anteriormente, com a ressalva de que os sítios imediatamente fora do cluster também interagem com ele, já que temos agora spins &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; ao invés de sítios vazios. Temos o mesmo número de spins internos ao cluster que de pariculas anteriormente, assim como para as bordas do cluster e os mesmos quatro cantos. Além disso, os sítios fora do cluster também tem contribuição para o Hamiltoniano. O número de spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;L^2 - \frac{L^2}{4} - 2L&amp;lt;/math&amp;gt; e o número de spins fora do cluster com 1 vizinho &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;2L&amp;lt;/math&amp;gt;. Agora podemos somar todas essas contribuições.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = (-4J)(L^2 - \frac{L^2}{4} - 2L) + (-2J)(2L) + (-2J)*4(\frac{L}{2} - 2) + (-4J)(\frac{L}{2} - 2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da esquerda para a direita os termos são a contribuição dos spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, dos spins fora do cluster mas com um vizinho no cluster, dos spins na borda do cluster e dos spins interiores ao cluster. Abrindo os termos e simplificando a equação chegamos finalmente em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -(4L^2 - 8L)J&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E como nas simulações foram utilizadas que &amp;lt;math&amp;gt;\epsilon = 1&amp;lt;/math&amp;gt; para o caso do gás de rede e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt; para o modelo de Ising, temos portanto que as energias medidas com o modelo de Ising são equivalentes a 4 vezes as energias no modelo do gás de rede, como se verificou ao implementar a mesma função de medida para a linguagem de spins e de sítios vazios e ocupados. E com essa equação para o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições podemos perceber que o efeito do tamanho de rede é praticamente o mesmo, com a ressalva de que a energia por sítio deve ser também 4 vezes a energia por sítio do modelo do gás de rede.&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
&lt;br /&gt;
Passamos pelo que vem a ser o modelo do gás de rede na rede quadrada e apresentamos sua relação com o modelo de Ising. O Hamiltoniano do modelo do gás de rede nos mostra que ele é idêntico ao modelo de Ising com um termo de campo magnético externo. Ao fixarmos a densidade do modelo do gás de rede, impomos a restrição de que o modelo de Ising deve ter a magnetização constante para mantermos a equivalência. Também se discutiu o efeito do tamanho das redes simuladas e vimos que quanto maior o tamanho da rede mais próximo será o valor das energias por sítio em comparação com redes de tamanhos similares e vimos que isso se deve pelo fato do número de sítios no cluster do estado de menor energia crescer mais rápido no interior do cluster do que em seu perímetro.&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é a temperatura do banho térmico e o terceiro é a semente utilizada pelo gerador de números pseudo-aleatórios. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DGNU prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede com Densidade Constante e dinâmica local]]&lt;br /&gt;
&lt;br /&gt;
[[Modelo de ising com magnetização constante e algoritmo de Kawasaki]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Hist_kawasaki.png&amp;diff=3108</id>
		<title>Arquivo:Hist kawasaki.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Hist_kawasaki.png&amp;diff=3108"/>
		<updated>2020-11-26T23:21:46Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: Joaomesquita enviou uma nova versão de &amp;amp;quot;Arquivo:Hist kawasaki.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3107</id>
		<title>Gás de Rede 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3107"/>
		<updated>2020-11-26T23:10:40Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &lt;br /&gt;
Este trabalho tem o intuito de apresentar uma descrição do modelo do Gás de Rede bidimensional e traçar paralelos com o modelo de Ising, discutindo a relação entre seus Hamiltonianos.&lt;br /&gt;
&lt;br /&gt;
== Gás de Rede ==&lt;br /&gt;
&lt;br /&gt;
O Modelo do Gás de Rede 2D consiste em um sistema de &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas da forma &amp;lt;math&amp;gt;\sigma = {\sigma_1, \sigma_1, \dotsc, \sigma_N}&amp;lt;/math&amp;gt; onde cada sítio da rede pode assumir o valor &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, ocupado por uma partícula, ou &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;, não ocupado por uma partícula. A energia total do sistema é dada pelo Hamiltoniano do Gás de Rede, descrito pela equação&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \epsilon \sum_{\langle i,j \rangle} \sigma_i \sigma_j \qquad (1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde o somatório é dado entre os quatro vizinhos mais próximos e &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; é a constante de interação entre as partículas, para &amp;lt;math&amp;gt;\epsilon \geq 0&amp;lt;/math&amp;gt; a interação é atrativa. Por se tratar de uma rede quadrada com &amp;lt;math&amp;gt;L^2 = L \times L&amp;lt;/math&amp;gt; sítios, apenas uma parcela da rede é ocupada por partículas, ou seja, possuímos uma densidade constante &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; de partículas. Podemos expressar a condição da densidade constante da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} \sigma_i = \rho L^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazendo uma mudança de variáveis da forma &amp;lt;math&amp;gt;s_i = 2 \sigma_i - 1&amp;lt;/math&amp;gt; saímos da situação de ocupação e não ocupação de sítios e obtemos variáveis do Modelo de Ising &amp;lt;ref name=ISING&amp;gt; https://fiscomp.if.ufrgs.br/index.php/Ising_2D&amp;lt;/ref&amp;gt;, spins Up e Down. A variável &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; assume valor &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; (up) quando o sítio esta ocupado por uma partícula e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; quando não está. Aplicando a mudança de variáveis no Hamiltoniano do Gás de Rede obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} (s_i + 1)(s_j + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}[s_i s_j + s_i + s_j + 1]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Abrindo os termos dos três últimos somatórios se encontra que&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle}s_i = \sum_{\langle i,j \rangle}s_j = z \sum_{i}s_i&amp;lt;/math&amp;gt;, e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle} 1 = z L^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
o que simplifica a expressão para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{2} \epsilon z \sum_{i} s_i - \frac{1}{4} \epsilon z L^2 \qquad (2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; é o número de coordenação, isto é, o número de vizinhos de cada sítio, que para a rede quadrada é 4. Note a mudança no índice do somatório de &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Vemos que este Hamiltoniano possui a forma do Hamiltoniano do modelo de Ising com aplicação de um campo magnético externo, a menos de uma constante. Entretanto, com a densidade constante, fazendo a mesma mudança de variáveis, obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} s_i = (2\rho - 1) L^2 \qquad (3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicando essa relação no Hamiltoniano obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} s_i s_j - z \epsilon L^2 \rho  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; são constantes, o segundo termo é constante. Definindo &amp;lt;math&amp;gt;J = \epsilon / 4&amp;lt;/math&amp;gt; o Hamiltoniano se torna&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - J \sum_{\langle i,j \rangle} s_i s_j + \text{constante}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A constante não influencia nos valores da medida, pois ela se cancela na equação de mudança de estado &amp;lt;ref name=BARKEMA&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;. Vemos que, ao assumir a densidade constante, o modelo do Gás de Rede se torna o modelo de Ising sem a presença de um campo magnético. A condição da densidade constante é a magnetização total do modelo. &lt;br /&gt;
&lt;br /&gt;
É interessante notar que podemos tratar o modelo do gás de rede de duas formas: &#039;&#039;&#039;(a)&#039;&#039;&#039; assumir a densidade constante e utilizar o primeiro Hamiltoniano apresentado, ou &#039;&#039;&#039;(b)&#039;&#039;&#039; não assumir a densidade constante, aplicar a mudança de variáveis discutida e utilizar o Hamiltoniano que possuí a forma de Ising com campo magnético.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Método de Monte Carlo==&lt;br /&gt;
&lt;br /&gt;
===Princípios gerais===&lt;br /&gt;
&lt;br /&gt;
Para desenvolver a dinâmica do gás de rede, isto é, fazer com que ocorram alterações na posição das partículas, recorre-se ao método de Monte Carlo. Trata-se, em linhas gerais, de um método estatístico baseado em amostragem aleatória. É comum, ao introduzir-se o assunto, utilizar problemas de cálculo de áreas, como, por exemplo, a clássica história das crianças que desenharam, na areia, um círculo contido em um quadrado, de modo que o diâmetro do círculo seja igual ao lado do quadrado. Jogam, aleatoriamente, pedras no quadrado. Após uma grande quantidade de arremessos, compara-se o valor de pedras que estão dentro do círculo com o número total dentro do quadrado, fazendo a razão entre esses dois valores, encontra-se uma aproximação para a razão entre a área do círculo e a do quadrado, que equivale a &amp;lt;math&amp;gt;\pi/4&amp;lt;/math&amp;gt;. Desse modo, pode ser encontrada uma aproximação do valor de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; através do método de Monte Carlo, que simula uma aproximação experimental&amp;lt;ref name=KRAUTH&amp;gt;Krauth ,W. ,&amp;quot;Statistical Mechanics: Algorithms and Computations&amp;quot;. Oxford Master Series in Physics, Oxford University Press, 2006.&amp;lt;/ref&amp;gt;. É possível propor um novo modelo, no qual o quadrado é grande e as pedras são atiradas aleatoriamente de dentro do quadrado, de modo que a posição de arremesso é atualizada para a posição da última pedra jogada. A principal alteração nesse método é a possibilidade de que uma pedra seja atirada para fora do quadrado. Nesse caso, a posição para o próximo arremesso não muda e as pedras que foram parar fora das bordas do quadrado são empilhadas naquela posição. Essas mudanças no método caracterizam a aplicação de Monte Carlo em uma cadeia de Markov, definida de modo que a configuração do próximo estado depende somente da configuração atual. Até aqui, vimos o método de Monte Carlo aplicado em situações nas quais a probabilidade de um evento ocorrer na configuração subsequente do sistema é zero ou um. Para novas distribuições de probabilidade, utiliza-se o algoritmo de Metrópolis.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo de Metrópolis===&lt;br /&gt;
&lt;br /&gt;
Como mencionado, o método de Monte Carlo funciona através de atualizações em um sistema, fazendo com que ele passe de um estado para outro. Consideremos &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; como sendo o estado atual do sistema. O próximo estado será chamado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Chamamos a probabilidade do sistema passar do estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt;. A ideia do algoritmo de Metrópolis é aplicar essa probabilidade no método de Monte Carlo. Para isso, um método muito utilizado é calcular a probabilidade &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt; e compará-la a um número aleatório &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, de modo que &amp;lt;math&amp;gt;0&amp;lt;r&amp;lt;1&amp;lt;/math&amp;gt;. Se &amp;lt;math&amp;gt; p(\mu\to\nu)&amp;gt;r&amp;lt;/math&amp;gt;, então o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é adotado pelo sistema. Para aplicar essas ideias ao problema do gás de rede, o método mais simples é utilizando o algoritmo de Kawasaki, que faz com que dois sítios, selecionados aleatoriamente, tenham seus valores trocados. Isso implica que a magnetização do sistema será constante&amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;. Para calcular a probabilidade de aceitação dessa mudança, calcula-se a variação de energia entre os estados,&amp;lt;math&amp;gt;\Delta E= E_{\nu}-E_{\mu}&amp;lt;/math&amp;gt;, e aplica-se o valor obtido na equação de probabilidade de aceitação de Metrópolis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\mu\to\nu)=\left\{\begin{array}{rc} e^{\frac{-\Delta E}{k_BT}}, \quad \text{se}\quad \Delta E&amp;gt;0\\&lt;br /&gt;
1, \quad \text{caso contrario}\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, inicialmente foram feitas algumas alterações no algoritmo de Kawasaki. Limita-se a troca de valores somente entre um sítio e seus quatro vizinhos principais (isto é, acima, abaixo, à direita e à esquerda). Isso porque se tinha a intenção de recriar o comportamento difusivo de um gás no modelo do gás de rede em duas dimensões, porém, essa escolha para a dinâmica das simulações limita em muito a facilidade do sistema equilibrar, como será mostrado na parte de resultados. O algoritmo inicial consiste na seguinte ideia: No estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, seleciona-se aleatoriamente um sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. A partir dele, é sorteado um de seus vizinhos, digamos, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, com o qual haverá a troca de valor. Antes que ocorra a troca, são calculados os valores de dois Hamiltonianos: o que relaciona o sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; com seus vizinhos e o que relaciona &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; com seus vizinhos. Somados, eles representam o valor de &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt;. Após a troca, esses valores são recalculados, formando o valor de &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt;. Com esses valores, segue-se o cálculo da probabilidade da forma usual. &lt;br /&gt;
&lt;br /&gt;
Após verificar que a dinâmica inicialmente escolhida não era apropriada, optou-se por usar o algoritmo de Kawasaki tradicional, fazendo uso de uma listagem de quais eram os estados dos sítios e escolhendo os pares a serem trocados sempre como sítios de estados diferentes. Isso faz com que a aceitação do algoritmo de Monte Carlo seja muito mais elevada que ao do nosso algoritmo inicial, pois no caso em que grandes clusters são formados as trocas eram sempre rejeitadas de acordo com a dinâmica inicial.&lt;br /&gt;
&lt;br /&gt;
===Considerações práticas===&lt;br /&gt;
&lt;br /&gt;
Já consideramos os aspectos iniciais do método de Monte Carlo, mostrando suas aplicações. Vimos, do mesmo modo, a utilização do algoritmo de Metrópolis, dentro do qual aplicamos o algoritmo de Kawasaki (modificado) para desenvolver o sistema do gás de rede. Resta elucidar a função do parâmetro temporal, isto é, como as iterações desses algoritmos influenciam o sistema. Primeiramente, deve-se fixar um valor para o número de passos temporais que serão realizados. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações  do algoritmo de Metrópolis, abordado acima, sendo &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; o lado da rede quadrada. Chamamos de Passo de Monte Carlo (MCS) cada um desses passos temporais. Em outras palavras: em cada passo de Monte Carlo, todos os sítios tem a possibilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
=== Eficiência da dinâmica local ===&lt;br /&gt;
&lt;br /&gt;
Como mencionado acima, a primeira dinâmica escolhida foi a que restringe os sítios a trocarem de estado para apenas aqueles que são vizinhos próximos (os 4 acima, abaixo, a direita e a esquerda). Se verificou ao analisar os dados das simulações que na verdade essa dinâmica não era apropriada, pois a aceitação do algoritmo é muito baixa e com a amostragem escolhida (&amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS) o sistema ainda não estaria equilibrado. Isso pode ser percebido mais facilmente observando os histogramas das simulações. Sabe-se que a distribuição das grandezas macroscópicas de um sistema termodinâmico é a distribuição de Boltzmann &amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, então se espera para o sistema analisado que a energia tenha uma distribuição normal de frequências. Observe a diferença entre as distribuições para a energia do sistema no caso da dinâmica local inicialmente escolhida e no caso do algoritmo tradicional de Kawasaki:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Diferença entre distribuições para a energia do sistema por dinâmica escolhida.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Assim podemos notar que o sistema não está equilibrado após a amostragem com a dinâmica local. No caso do algoritmo tradicional o sistema se encontra em equilíbrio. A referência na qual esse trabalho mais se inspira, Monte Carlo Methods in Statistical Physics, de Newman e Barkema, não dá a devida ênfase para quão interessante computacionalmente é se manter na linguagem do modelo de Ising e adotar o algoritmo de Kawasaki.&lt;br /&gt;
É importante notar que as simulações da dinâmica de Kawasaki foram feitas na linguagem do modelo de Ising, com spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, ao invés de sítios ocupados por partículas &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; e sítios desocupados &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Essa mudança é importante para entender a mudança na escala das grandezas entre as simulações. Como a constante de interação &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; do modelo de Ising é um quarto da constante &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, a temperatura e a energia no modelo de Ising valem &amp;lt;math&amp;gt;\frac{1}{4}&amp;lt;/math&amp;gt; da temperatura e da energia nas simulações com a dinâmica local na linguagem do gás de rede.&lt;br /&gt;
&lt;br /&gt;
=== Energia e efeito do tamanho da rede ===&lt;br /&gt;
&lt;br /&gt;
A grandeza que foi medida nas simulações é a energia total do sistema. Para analisar os efeitos do tamanho da rede devemos comparar os valores das energias por número de sítios, já que quanto maior a rede maior o número de partículas e portanto maior o valor absoluto da energia. Abaixo temos um gráfico com os valores da energia total do sistema por número de sítios em função da temperatura, com os dados das três redes simuladas (L = 16, 32, 64).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:energia.png|thumb|center|none|alt=Alt text|Energia total do sistema dividida pelo número de sítios em função da temperatura para redes de tamanhos diferentes. Cada ponto no gráfico é a média de 5 amostragens com seu desvio padrão.|480px]]&lt;br /&gt;
&lt;br /&gt;
Aqui o comportamento da energia é como esperado para o modelo. Há uma queda no valor da energia conforme a temperatura do reservatório diminui abaixo da temperatura crítica, e conforme a temperatura aumenta acima da temperatura crítica, a energia aumenta mais devagar dado que é o estado em que o sistema está na sua fase amorfa.&lt;br /&gt;
&lt;br /&gt;
Algo que se nota no gráfico acima é a diferença nos valores da energia das redes &amp;lt;math&amp;gt;L = 32&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. É perceptível que as duas redes maiores apresentam valores de energia muito mais próximos. Isso se dá justamente pelo tamanho da rede e o fato da densidade ser a mesma.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:rede16.png|thumb|center|upright=4|none|alt= Alt text|Diagrama ilustrando o estado de menor energia para a rede de 16. As cores indicam o número de sítios vizinhos ocupados.|480px]]&lt;br /&gt;
&lt;br /&gt;
Para entender como o valor da energia total do sistema por número de sítios varia com o tamanho da rede é interessante calcular essa grandeza no estado de menor energia. No caso da rede quadrada, o estado de menor energia é um cluster quadrado. Como ilustrado no diagrama acima, existem sítios com 3 vizinhos ocupados e sítios com 2 vizinhos ocupados. Estes são os da borda do cluster. Todos os outros internos ao cluster tem 4 vizinhos ocupados e portanto contribuem com &amp;lt;math&amp;gt;-4\epsilon&amp;lt;/math&amp;gt; para o Hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
Nesse trabalho adotamos &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt;, o que facilita o cálculo da energia total, pois o tamanho do lado do cluster é &amp;lt;math&amp;gt; l = \sqrt{\frac{L^2}{4}}&amp;lt;/math&amp;gt;. Temos &amp;lt;math&amp;gt;(l - 2)^2&amp;lt;/math&amp;gt; partículas internas ao cluster e portanto com 4 vizinhos e &amp;lt;math&amp;gt;4(l - 2)&amp;lt;/math&amp;gt; partículas nas bordas com 3 vizinhos. O Hamiltoniano é portanto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = (-2\epsilon)*4 + (-3\epsilon)*4(l - 2) + (-4\epsilon)(l - 2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O primeiro termo é a referente às interações dos 4 cantos do cluster, que tem apenas 2 vizinhos ocupados. Abrindo os termos e simplificando a equação chegamos ao valor do Hamiltoniano do estado de menor energia do gás de rede:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = -(L^2 - 2L)\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo por 2 para encontrar o valor da energia total e então por &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;e = \frac{E}{L^2} = - \frac{\epsilon}{2} + \frac{\epsilon}{L}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
que é a grandeza apresentada no gráfico anterior. Essa elaboração foi feita para o modelo do gás de rede, porém as simulações foram feitas com o modelo de Ising, com a restrição de que a magnetização era constante (a quantidade de spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é constante).&lt;br /&gt;
&lt;br /&gt;
Usando a equação &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;J = \frac{\epsilon}{4}&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J\sum{i}s_i - 4JL^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utilizamos então a equação &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt; e percebemos que os termos do meio e da direita se cancelam, deixando somente o primeiro termo para avaliarmos em termos do estado de menor energia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J(2\rho - 1)L^2 - 4JL^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; = -J\sum_{\langle i, j \rangle}s_i s_j &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora podemos avaliar o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições. Para isso podemos nos basear no diagrama usado anteriormente, com a ressalva de que os sítios imediatamente fora do cluster também interagem com ele, já que temos agora spins &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; ao invés de sítios vazios. Temos o mesmo número de spins internos ao cluster que de pariculas anteriormente, assim como para as bordas do cluster e os mesmos quatro cantos. Além disso, os sítios fora do cluster também tem contribuição para o Hamiltoniano. O número de spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;L^2 - \frac{L^2}{4} - 2L&amp;lt;/math&amp;gt; e o número de spins fora do cluster com 1 vizinho &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;2L&amp;lt;/math&amp;gt;. Agora podemos somar todas essas contribuições.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = (-4J)(L^2 - \frac{L^2}{4} - 2L) + (-2J)(2L) + (-2J)*4(\frac{L}{2} - 2) + (-4J)(\frac{L}{2} - 2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da esquerda para a direita os termos são a contribuição dos spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, dos spins fora do cluster mas com um vizinho no cluster, dos spins na borda do cluster e dos spins interiores ao cluster. Abrindo os termos e simplificando a equação chegamos finalmente em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -(4L^2 - 8L)J&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E como nas simulações foram utilizadas que &amp;lt;math&amp;gt;\epsilon = 1&amp;lt;/math&amp;gt; para o caso do gás de rede e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt; para o modelo de Ising, temos portanto que as energias medidas com o modelo de Ising são equivalentes a 4 vezes as energias no modelo do gás de rede, como se verificou ao implementar a mesma função de medida para a linguagem de spins e de sítios vazios e ocupados. E com essa equação para o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições podemos perceber que o efeito do tamanho de rede é praticamente o mesmo, com a ressalva de que a energia por sítio deve ser também 4 vezes a energia por sítio do modelo do gás de rede.&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
&lt;br /&gt;
Passamos pelo que vem a ser o modelo do gás de rede na rede quadrada e apresentamos sua relação com o modelo de Ising. O Hamiltoniano do modelo do gás de rede nos mostra que ele é idêntico ao modelo de Ising com um termo de campo magnético externo. Ao fixarmos a densidade do modelo do gás de rede, impomos a restrição de que o modelo de Ising deve ter a magnetização constante para mantermos a equivalência. Também se discutiu o efeito do tamanho das redes simuladas e vimos que quanto maior o tamanho da rede mais próximo será o valor das energias por sítio em comparação com redes de tamanhos similares e vimos que isso se deve pelo fato do número de sítios no cluster do estado de menor energia crescer mais rápido no interior do cluster do que em seu perímetro.&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é a temperatura do banho térmico e o terceiro é a semente utilizada pelo gerador de números pseudo-aleatórios. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DGNU prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede com Densidade Constante e dinâmica local]]&lt;br /&gt;
&lt;br /&gt;
[[Modelo de ising com magnetização constante e algoritmo de Kawasaki]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Hist_kawasaki_alta_temp.png&amp;diff=3106</id>
		<title>Arquivo:Hist kawasaki alta temp.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Hist_kawasaki_alta_temp.png&amp;diff=3106"/>
		<updated>2020-11-26T23:06:39Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Hist_dinamica_local_alta_temp.png&amp;diff=3105</id>
		<title>Arquivo:Hist dinamica local alta temp.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Hist_dinamica_local_alta_temp.png&amp;diff=3105"/>
		<updated>2020-11-26T23:05:55Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3104</id>
		<title>Gás de Rede 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3104"/>
		<updated>2020-11-26T23:05:16Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &lt;br /&gt;
Este trabalho tem o intuito de apresentar uma descrição do modelo do Gás de Rede bidimensional e traçar paralelos com o modelo de Ising, discutindo a relação entre seus Hamiltonianos.&lt;br /&gt;
&lt;br /&gt;
== Gás de Rede ==&lt;br /&gt;
&lt;br /&gt;
O Modelo do Gás de Rede 2D consiste em um sistema de &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas da forma &amp;lt;math&amp;gt;\sigma = {\sigma_1, \sigma_1, \dotsc, \sigma_N}&amp;lt;/math&amp;gt; onde cada sítio da rede pode assumir o valor &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, ocupado por uma partícula, ou &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;, não ocupado por uma partícula. A energia total do sistema é dada pelo Hamiltoniano do Gás de Rede, descrito pela equação&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \epsilon \sum_{\langle i,j \rangle} \sigma_i \sigma_j \qquad (1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde o somatório é dado entre os quatro vizinhos mais próximos e &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; é a constante de interação entre as partículas, para &amp;lt;math&amp;gt;\epsilon \geq 0&amp;lt;/math&amp;gt; a interação é atrativa. Por se tratar de uma rede quadrada com &amp;lt;math&amp;gt;L^2 = L \times L&amp;lt;/math&amp;gt; sítios, apenas uma parcela da rede é ocupada por partículas, ou seja, possuímos uma densidade constante &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; de partículas. Podemos expressar a condição da densidade constante da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} \sigma_i = \rho L^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazendo uma mudança de variáveis da forma &amp;lt;math&amp;gt;s_i = 2 \sigma_i - 1&amp;lt;/math&amp;gt; saímos da situação de ocupação e não ocupação de sítios e obtemos variáveis do Modelo de Ising &amp;lt;ref name=ISING&amp;gt; https://fiscomp.if.ufrgs.br/index.php/Ising_2D&amp;lt;/ref&amp;gt;, spins Up e Down. A variável &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; assume valor &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; (up) quando o sítio esta ocupado por uma partícula e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; quando não está. Aplicando a mudança de variáveis no Hamiltoniano do Gás de Rede obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} (s_i + 1)(s_j + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}[s_i s_j + s_i + s_j + 1]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Abrindo os termos dos três últimos somatórios se encontra que&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle}s_i = \sum_{\langle i,j \rangle}s_j = z \sum_{i}s_i&amp;lt;/math&amp;gt;, e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle} 1 = z L^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
o que simplifica a expressão para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{2} \epsilon z \sum_{i} s_i - \frac{1}{4} \epsilon z L^2 \qquad (2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; é o número de coordenação, isto é, o número de vizinhos de cada sítio, que para a rede quadrada é 4. Note a mudança no índice do somatório de &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Vemos que este Hamiltoniano possui a forma do Hamiltoniano do modelo de Ising com aplicação de um campo magnético externo, a menos de uma constante. Entretanto, com a densidade constante, fazendo a mesma mudança de variáveis, obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} s_i = (2\rho - 1) L^2 \qquad (3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicando essa relação no Hamiltoniano obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} s_i s_j - z \epsilon L^2 \rho  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; são constantes, o segundo termo é constante. Definindo &amp;lt;math&amp;gt;J = \epsilon / 4&amp;lt;/math&amp;gt; o Hamiltoniano se torna&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - J \sum_{\langle i,j \rangle} s_i s_j + \text{constante}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A constante não influencia nos valores da medida, pois ela se cancela na equação de mudança de estado &amp;lt;ref name=BARKEMA&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;. Vemos que, ao assumir a densidade constante, o modelo do Gás de Rede se torna o modelo de Ising sem a presença de um campo magnético. A condição da densidade constante é a magnetização total do modelo. &lt;br /&gt;
&lt;br /&gt;
É interessante notar que podemos tratar o modelo do gás de rede de duas formas: &#039;&#039;&#039;(a)&#039;&#039;&#039; assumir a densidade constante e utilizar o primeiro Hamiltoniano apresentado, ou &#039;&#039;&#039;(b)&#039;&#039;&#039; não assumir a densidade constante, aplicar a mudança de variáveis discutida e utilizar o Hamiltoniano que possuí a forma de Ising com campo magnético.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Método de Monte Carlo==&lt;br /&gt;
&lt;br /&gt;
===Princípios gerais===&lt;br /&gt;
&lt;br /&gt;
Para desenvolver a dinâmica do gás de rede, isto é, fazer com que ocorram alterações na posição das partículas, recorre-se ao método de Monte Carlo. Trata-se, em linhas gerais, de um método estatístico baseado em amostragem aleatória. É comum, ao introduzir-se o assunto, utilizar problemas de cálculo de áreas, como, por exemplo, a clássica história das crianças que desenharam, na areia, um círculo contido em um quadrado, de modo que o diâmetro do círculo seja igual ao lado do quadrado. Jogam, aleatoriamente, pedras no quadrado. Após uma grande quantidade de arremessos, compara-se o valor de pedras que estão dentro do círculo com o número total dentro do quadrado, fazendo a razão entre esses dois valores, encontra-se uma aproximação para a razão entre a área do círculo e a do quadrado, que equivale a &amp;lt;math&amp;gt;\pi/4&amp;lt;/math&amp;gt;. Desse modo, pode ser encontrada uma aproximação do valor de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; através do método de Monte Carlo, que simula uma aproximação experimental&amp;lt;ref name=KRAUTH&amp;gt;Krauth ,W. ,&amp;quot;Statistical Mechanics: Algorithms and Computations&amp;quot;. Oxford Master Series in Physics, Oxford University Press, 2006.&amp;lt;/ref&amp;gt;. É possível propor um novo modelo, no qual o quadrado é grande e as pedras são atiradas aleatoriamente de dentro do quadrado, de modo que a posição de arremesso é atualizada para a posição da última pedra jogada. A principal alteração nesse método é a possibilidade de que uma pedra seja atirada para fora do quadrado. Nesse caso, a posição para o próximo arremesso não muda e as pedras que foram parar fora das bordas do quadrado são empilhadas naquela posição. Essas mudanças no método caracterizam a aplicação de Monte Carlo em uma cadeia de Markov, definida de modo que a configuração do próximo estado depende somente da configuração atual. Até aqui, vimos o método de Monte Carlo aplicado em situações nas quais a probabilidade de um evento ocorrer na configuração subsequente do sistema é zero ou um. Para novas distribuições de probabilidade, utiliza-se o algoritmo de Metrópolis.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo de Metrópolis===&lt;br /&gt;
&lt;br /&gt;
Como mencionado, o método de Monte Carlo funciona através de atualizações em um sistema, fazendo com que ele passe de um estado para outro. Consideremos &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; como sendo o estado atual do sistema. O próximo estado será chamado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Chamamos a probabilidade do sistema passar do estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt;. A ideia do algoritmo de Metrópolis é aplicar essa probabilidade no método de Monte Carlo. Para isso, um método muito utilizado é calcular a probabilidade &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt; e compará-la a um número aleatório &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, de modo que &amp;lt;math&amp;gt;0&amp;lt;r&amp;lt;1&amp;lt;/math&amp;gt;. Se &amp;lt;math&amp;gt; p(\mu\to\nu)&amp;gt;r&amp;lt;/math&amp;gt;, então o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é adotado pelo sistema. Para aplicar essas ideias ao problema do gás de rede, o método mais simples é utilizando o algoritmo de Kawasaki, que faz com que dois sítios, selecionados aleatoriamente, tenham seus valores trocados. Isso implica que a magnetização do sistema será constante&amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;. Para calcular a probabilidade de aceitação dessa mudança, calcula-se a variação de energia entre os estados,&amp;lt;math&amp;gt;\Delta E= E_{\nu}-E_{\mu}&amp;lt;/math&amp;gt;, e aplica-se o valor obtido na equação de probabilidade de aceitação de Metrópolis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\mu\to\nu)=\left\{\begin{array}{rc} e^{\frac{-\Delta E}{k_BT}}, \quad \text{se}\quad \Delta E&amp;gt;0\\&lt;br /&gt;
1, \quad \text{caso contrario}\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, inicialmente foram feitas algumas alterações no algoritmo de Kawasaki. Limita-se a troca de valores somente entre um sítio e seus quatro vizinhos principais (isto é, acima, abaixo, à direita e à esquerda). Isso porque se tinha a intenção de recriar o comportamento difusivo de um gás no modelo do gás de rede em duas dimensões, porém, essa escolha para a dinâmica das simulações limita em muito a facilidade do sistema equilibrar, como será mostrado na parte de resultados. O algoritmo inicial consiste na seguinte ideia: No estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, seleciona-se aleatoriamente um sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. A partir dele, é sorteado um de seus vizinhos, digamos, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, com o qual haverá a troca de valor. Antes que ocorra a troca, são calculados os valores de dois Hamiltonianos: o que relaciona o sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; com seus vizinhos e o que relaciona &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; com seus vizinhos. Somados, eles representam o valor de &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt;. Após a troca, esses valores são recalculados, formando o valor de &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt;. Com esses valores, segue-se o cálculo da probabilidade da forma usual. &lt;br /&gt;
&lt;br /&gt;
Após verificar que a dinâmica inicialmente escolhida não era apropriada, optou-se por usar o algoritmo de Kawasaki tradicional, fazendo uso de uma listagem de quais eram os estados dos sítios e escolhendo os pares a serem trocados sempre como sítios de estados diferentes. Isso faz com que a aceitação do algoritmo de Monte Carlo seja muito mais elevada que ao do nosso algoritmo inicial, pois no caso em que grandes clusters são formados as trocas eram sempre rejeitadas de acordo com a dinâmica inicial.&lt;br /&gt;
&lt;br /&gt;
===Considerações práticas===&lt;br /&gt;
&lt;br /&gt;
Já consideramos os aspectos iniciais do método de Monte Carlo, mostrando suas aplicações. Vimos, do mesmo modo, a utilização do algoritmo de Metrópolis, dentro do qual aplicamos o algoritmo de Kawasaki (modificado) para desenvolver o sistema do gás de rede. Resta elucidar a função do parâmetro temporal, isto é, como as iterações desses algoritmos influenciam o sistema. Primeiramente, deve-se fixar um valor para o número de passos temporais que serão realizados. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações  do algoritmo de Metrópolis, abordado acima, sendo &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; o lado da rede quadrada. Chamamos de Passo de Monte Carlo (MCS) cada um desses passos temporais. Em outras palavras: em cada passo de Monte Carlo, todos os sítios tem a possibilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
=== Eficiência da dinâmica local ===&lt;br /&gt;
&lt;br /&gt;
Como mencionado acima, a primeira dinâmica escolhida foi a que restringe os sítios a trocarem de estado para apenas aqueles que são vizinhos próximos (os 4 acima, abaixo, a direita e a esquerda). Se verificou ao analisar os dados das simulações que na verdade essa dinâmica não era apropriada, pois a aceitação do algoritmo é muito baixa e com a amostragem escolhida (&amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS) o sistema ainda não estaria equilibrado. Isso pode ser percebido mais facilmente observando os histogramas das simulações. Sabe-se que a distribuição das grandezas macroscópicas de um sistema termodinâmico é a distribuição de Boltzmann &amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, então se espera para o sistema analisado que a energia tenha uma distribuição normal de frequências. Observe a diferença entre as distribuições para a energia do sistema no caso da dinâmica local inicialmente escolhida e no caso do algoritmo tradicional de Kawasaki:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Diferença entre distribuições para a energia do sistema por dinâmica escolhida.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_dinamica_local_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki_alta_temp.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki em alta temperatura (acima da temperatura crítica) após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Assim podemos notar que o sistema não está equilibrado após a amostragem com a dinâmica local. No caso do algoritmo tradicional o sistema se encontra em equilíbrio. A referência na qual esse trabalho mais se inspira, Monte Carlo Methods in Statistical Physics, de Newman e Barkema, não dá a devida ênfase para quão interessante computacionalmente é se manter na linguagem do modelo de Ising e adotar o algoritmo de Kawasaki.&lt;br /&gt;
É importante notar que as simulações da dinâmica de Kawasaki foram feitas na linguagem do modelo de Ising, com spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, ao invés de sítios ocupados por partículas &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; e sítios desocupados &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Essa mudança é importante para entender a mudança na escala das grandezas entre as simulações. Como a constante de interação &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; do modelo de Ising é um quarto da constante &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, a temperatura e a energia no modelo de Ising valem &amp;lt;math&amp;gt;\frac{1}{4}&amp;lt;/math&amp;gt; da temperatura e da energia nas simulações com a dinâmica local na linguagem do gás de rede.&lt;br /&gt;
&lt;br /&gt;
=== Energia e efeito do tamanho da rede ===&lt;br /&gt;
&lt;br /&gt;
A grandeza que foi medida nas simulações é a energia total do sistema. Para analisar os efeitos do tamanho da rede devemos comparar os valores das energias por número de sítios, já que quanto maior a rede maior o número de partículas e portanto maior o valor absoluto da energia. Abaixo temos um gráfico com os valores da energia total do sistema por número de sítios em função da temperatura, com os dados das três redes simuladas (L = 16, 32, 64).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:energia.png|thumb|center|none|alt=Alt text|Energia total do sistema dividida pelo número de sítios em função da temperatura para redes de tamanhos diferentes. Cada ponto no gráfico é a média de 5 amostragens com seu desvio padrão.|480px]]&lt;br /&gt;
&lt;br /&gt;
Aqui o comportamento da energia é como esperado para o modelo. Há uma queda no valor da energia conforme a temperatura do reservatório diminui abaixo da temperatura crítica, e conforme a temperatura aumenta acima da temperatura crítica, a energia aumenta mais devagar dado que é o estado em que o sistema está na sua fase amorfa.&lt;br /&gt;
&lt;br /&gt;
Algo que se nota no gráfico acima é a diferença nos valores da energia das redes &amp;lt;math&amp;gt;L = 32&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. É perceptível que as duas redes maiores apresentam valores de energia muito mais próximos. Isso se dá justamente pelo tamanho da rede e o fato da densidade ser a mesma.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:rede16.png|thumb|center|upright=4|none|alt= Alt text|Diagrama ilustrando o estado de menor energia para a rede de 16. As cores indicam o número de sítios vizinhos ocupados.|480px]]&lt;br /&gt;
&lt;br /&gt;
Para entender como o valor da energia total do sistema por número de sítios varia com o tamanho da rede é interessante calcular essa grandeza no estado de menor energia. No caso da rede quadrada, o estado de menor energia é um cluster quadrado. Como ilustrado no diagrama acima, existem sítios com 3 vizinhos ocupados e sítios com 2 vizinhos ocupados. Estes são os da borda do cluster. Todos os outros internos ao cluster tem 4 vizinhos ocupados e portanto contribuem com &amp;lt;math&amp;gt;-4\epsilon&amp;lt;/math&amp;gt; para o Hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
Nesse trabalho adotamos &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt;, o que facilita o cálculo da energia total, pois o tamanho do lado do cluster é &amp;lt;math&amp;gt; l = \sqrt{\frac{L^2}{4}}&amp;lt;/math&amp;gt;. Temos &amp;lt;math&amp;gt;(l - 2)^2&amp;lt;/math&amp;gt; partículas internas ao cluster e portanto com 4 vizinhos e &amp;lt;math&amp;gt;4(l - 2)&amp;lt;/math&amp;gt; partículas nas bordas com 3 vizinhos. O Hamiltoniano é portanto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = (-2\epsilon)*4 + (-3\epsilon)*4(l - 2) + (-4\epsilon)(l - 2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O primeiro termo é a referente às interações dos 4 cantos do cluster, que tem apenas 2 vizinhos ocupados. Abrindo os termos e simplificando a equação chegamos ao valor do Hamiltoniano do estado de menor energia do gás de rede:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = -(L^2 - 2L)\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo por 2 para encontrar o valor da energia total e então por &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;e = \frac{E}{L^2} = - \frac{\epsilon}{2} + \frac{\epsilon}{L}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
que é a grandeza apresentada no gráfico anterior. Essa elaboração foi feita para o modelo do gás de rede, porém as simulações foram feitas com o modelo de Ising, com a restrição de que a magnetização era constante (a quantidade de spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é constante).&lt;br /&gt;
&lt;br /&gt;
Usando a equação &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;J = \frac{\epsilon}{4}&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J\sum{i}s_i - 4JL^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utilizamos então a equação &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt; e percebemos que os termos do meio e da direita se cancelam, deixando somente o primeiro termo para avaliarmos em termos do estado de menor energia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J(2\rho - 1)L^2 - 4JL^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; = -J\sum_{\langle i, j \rangle}s_i s_j &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora podemos avaliar o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições. Para isso podemos nos basear no diagrama usado anteriormente, com a ressalva de que os sítios imediatamente fora do cluster também interagem com ele, já que temos agora spins &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; ao invés de sítios vazios. Temos o mesmo número de spins internos ao cluster que de pariculas anteriormente, assim como para as bordas do cluster e os mesmos quatro cantos. Além disso, os sítios fora do cluster também tem contribuição para o Hamiltoniano. O número de spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;L^2 - \frac{L^2}{4} - 2L&amp;lt;/math&amp;gt; e o número de spins fora do cluster com 1 vizinho &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;2L&amp;lt;/math&amp;gt;. Agora podemos somar todas essas contribuições.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = (-4J)(L^2 - \frac{L^2}{4} - 2L) + (-2J)(2L) + (-2J)*4(\frac{L}{2} - 2) + (-4J)(\frac{L}{2} - 2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da esquerda para a direita os termos são a contribuição dos spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, dos spins fora do cluster mas com um vizinho no cluster, dos spins na borda do cluster e dos spins interiores ao cluster. Abrindo os termos e simplificando a equação chegamos finalmente em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -(4L^2 - 8L)J&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E como nas simulações foram utilizadas que &amp;lt;math&amp;gt;\epsilon = 1&amp;lt;/math&amp;gt; para o caso do gás de rede e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt; para o modelo de Ising, temos portanto que as energias medidas com o modelo de Ising são equivalentes a 4 vezes as energias no modelo do gás de rede, como se verificou ao implementar a mesma função de medida para a linguagem de spins e de sítios vazios e ocupados. E com essa equação para o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições podemos perceber que o efeito do tamanho de rede é praticamente o mesmo, com a ressalva de que a energia por sítio deve ser também 4 vezes a energia por sítio do modelo do gás de rede.&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
&lt;br /&gt;
Passamos pelo que vem a ser o modelo do gás de rede na rede quadrada e apresentamos sua relação com o modelo de Ising. O Hamiltoniano do modelo do gás de rede nos mostra que ele é idêntico ao modelo de Ising com um termo de campo magnético externo. Ao fixarmos a densidade do modelo do gás de rede, impomos a restrição de que o modelo de Ising deve ter a magnetização constante para mantermos a equivalência. Também se discutiu o efeito do tamanho das redes simuladas e vimos que quanto maior o tamanho da rede mais próximo será o valor das energias por sítio em comparação com redes de tamanhos similares e vimos que isso se deve pelo fato do número de sítios no cluster do estado de menor energia crescer mais rápido no interior do cluster do que em seu perímetro.&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é a temperatura do banho térmico e o terceiro é a semente utilizada pelo gerador de números pseudo-aleatórios. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DGNU prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede com Densidade Constante e dinâmica local]]&lt;br /&gt;
&lt;br /&gt;
[[Modelo de ising com magnetização constante e algoritmo de Kawasaki]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3102</id>
		<title>Gás de Rede 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3102"/>
		<updated>2020-11-26T19:17:29Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Este trabalho tem o intuito de apresentar uma descrição do modelo do Gás de Rede bidimensional e traçar paralelos com o modelo de Ising, discutindo a relação entre seus Hamiltonianos.&lt;br /&gt;
&lt;br /&gt;
== Gás de Rede ==&lt;br /&gt;
&lt;br /&gt;
O Modelo do Gás de Rede 2D consiste em um sistema de &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas da forma &amp;lt;math&amp;gt;\sigma = {\sigma_1, \sigma_1, \dotsc, \sigma_N}&amp;lt;/math&amp;gt; onde cada sítio da rede pode assumir o valor &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, ocupado por uma partícula, ou &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;, não ocupado por uma partícula. A energia total do sistema é dada pelo Hamiltoniano do Gás de Rede, descrito pela equação&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \epsilon \sum_{\langle i,j \rangle} \sigma_i \sigma_j \qquad (1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde o somatório é dado entre os quatro vizinhos mais próximos e &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; é a constante de interação entre as partículas, para &amp;lt;math&amp;gt;\epsilon \geq 0&amp;lt;/math&amp;gt; a interação é atrativa. Por se tratar de uma rede quadrada com &amp;lt;math&amp;gt;L^2 = L \times L&amp;lt;/math&amp;gt; sítios, apenas uma parcela da rede é ocupada por partículas, ou seja, possuímos uma densidade constante &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; de partículas. Podemos expressar a condição da densidade constante da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} \sigma_i = \rho L^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazendo uma mudança de variáveis da forma &amp;lt;math&amp;gt;s_i = 2 \sigma_i - 1&amp;lt;/math&amp;gt; saímos da situação de ocupação e não ocupação de sítios e obtemos variáveis do Modelo de Ising &amp;lt;ref name=ISING&amp;gt; https://fiscomp.if.ufrgs.br/index.php/Ising_2D&amp;lt;/ref&amp;gt;, spins Up e Down. A variável &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; assume valor &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; (up) quando o sítio esta ocupado por uma partícula e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; quando não está. Aplicando a mudança de variáveis no Hamiltoniano do Gás de Rede obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} (s_i + 1)(s_j + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}[s_i s_j + s_i + s_j + 1]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Abrindo os termos dos três últimos somatórios se encontra que&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle}s_i = \sum_{\langle i,j \rangle}s_j = z \sum_{i}s_i&amp;lt;/math&amp;gt;, e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle} 1 = z L^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
o que simplifica a expressão para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{2} \epsilon z \sum_{i} s_i - \frac{1}{4} \epsilon z L^2 \qquad (2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; é o número de coordenação, isto é, o número de vizinhos de cada sítio, que para a rede quadrada é 4. Note a mudança no índice do somatório de &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Vemos que este Hamiltoniano possui a forma do Hamiltoniano do modelo de Ising com aplicação de um campo magnético externo, a menos de uma constante. Entretanto, com a densidade constante, fazendo a mesma mudança de variáveis, obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} s_i = (2\rho - 1) L^2 \qquad (3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicando essa relação no Hamiltoniano obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} s_i s_j - z \epsilon L^2 \rho  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; são constantes, o segundo termo é constante. Definindo &amp;lt;math&amp;gt;J = \epsilon / 4&amp;lt;/math&amp;gt; o Hamiltoniano se torna&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - J \sum_{\langle i,j \rangle} s_i s_j + \text{constante}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A constante não influencia nos valores da medida, pois ela se cancela na equação de mudança de estado &amp;lt;ref name=BARKEMA&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;. Vemos que, ao assumir a densidade constante, o modelo do Gás de Rede se torna o modelo de Ising sem a presença de um campo magnético. A condição da densidade constante é a magnetização total do modelo. &lt;br /&gt;
&lt;br /&gt;
É interessante notar que podemos tratar o modelo do gás de rede de duas formas: &#039;&#039;&#039;(a)&#039;&#039;&#039; assumir a densidade constante e utilizar o primeiro Hamiltoniano apresentado, ou &#039;&#039;&#039;(b)&#039;&#039;&#039; não assumir a densidade constante, aplicar a mudança de variáveis discutida e utilizar o Hamiltoniano que possuí a forma de Ising com campo magnético.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Método de Monte Carlo==&lt;br /&gt;
&lt;br /&gt;
===Princípios gerais===&lt;br /&gt;
&lt;br /&gt;
Para desenvolver a dinâmica do gás de rede, isto é, fazer com que ocorram alterações na posição das partículas, recorre-se ao método de Monte Carlo. Trata-se, em linhas gerais, de um método estatístico baseado em amostragem aleatória. É comum, ao introduzir-se o assunto, utilizar problemas de cálculo de áreas, como, por exemplo, a clássica história das crianças que desenharam, na areia, um círculo contido em um quadrado, de modo que o diâmetro do círculo seja igual ao lado do quadrado. Jogam, aleatoriamente, pedras no quadrado. Após uma grande quantidade de arremessos, compara-se o valor de pedras que estão dentro do círculo com o número total dentro do quadrado, fazendo a razão entre esses dois valores, encontra-se uma aproximação para a razão entre a área do círculo e a do quadrado, que equivale a &amp;lt;math&amp;gt;\pi/4&amp;lt;/math&amp;gt;. Desse modo, pode ser encontrada uma aproximação do valor de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; através do método de Monte Carlo, que simula uma aproximação experimental&amp;lt;ref name=KRAUTH&amp;gt;Krauth ,W. ,&amp;quot;Statistical Mechanics: Algorithms and Computations&amp;quot;. Oxford Master Series in Physics, Oxford University Press, 2006.&amp;lt;/ref&amp;gt;. É possível propor um novo modelo, no qual o quadrado é grande e as pedras são atiradas aleatoriamente de dentro do quadrado, de modo que a posição de arremesso é atualizada para a posição da última pedra jogada. A principal alteração nesse método é a possibilidade de que uma pedra seja atirada para fora do quadrado. Nesse caso, a posição para o próximo arremesso não muda e as pedras que foram parar fora das bordas do quadrado são empilhadas naquela posição. Essas mudanças no método caracterizam a aplicação de Monte Carlo em uma cadeia de Markov, definida de modo que a configuração do próximo estado depende somente da configuração atual. Até aqui, vimos o método de Monte Carlo aplicado em situações nas quais a probabilidade de um evento ocorrer na configuração subsequente do sistema é zero ou um. Para novas distribuições de probabilidade, utiliza-se o algoritmo de Metrópolis.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo de Metrópolis===&lt;br /&gt;
&lt;br /&gt;
Como mencionado, o método de Monte Carlo funciona através de atualizações em um sistema, fazendo com que ele passe de um estado para outro. Consideremos &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; como sendo o estado atual do sistema. O próximo estado será chamado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Chamamos a probabilidade do sistema passar do estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt;. A ideia do algoritmo de Metrópolis é aplicar essa probabilidade no método de Monte Carlo. Para isso, um método muito utilizado é calcular a probabilidade &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt; e compará-la a um número aleatório &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, de modo que &amp;lt;math&amp;gt;0&amp;lt;r&amp;lt;1&amp;lt;/math&amp;gt;. Se &amp;lt;math&amp;gt; p(\mu\to\nu)&amp;gt;r&amp;lt;/math&amp;gt;, então o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é adotado pelo sistema. Para aplicar essas ideias ao problema do gás de rede, o método mais simples é utilizando o algoritmo de Kawasaki, que faz com que dois sítios, selecionados aleatoriamente, tenham seus valores trocados. Isso implica que a magnetização do sistema será constante&amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;. Para calcular a probabilidade de aceitação dessa mudança, calcula-se a variação de energia entre os estados,&amp;lt;math&amp;gt;\Delta E= E_{\nu}-E_{\mu}&amp;lt;/math&amp;gt;, e aplica-se o valor obtido na equação de probabilidade de aceitação de Metrópolis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\mu\to\nu)=\left\{\begin{array}{rc} e^{\frac{-\Delta E}{k_BT}}, \quad \text{se}\quad \Delta E&amp;gt;0\\&lt;br /&gt;
1, \quad \text{caso contrario}\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, inicialmente foram feitas algumas alterações no algoritmo de Kawasaki. Limita-se a troca de valores somente entre um sítio e seus quatro vizinhos principais (isto é, acima, abaixo, à direita e à esquerda). Isso porque se tinha a intenção de recriar o comportamento difusivo de um gás no modelo do gás de rede em duas dimensões, porém, essa escolha para a dinâmica das simulações limita em muito a facilidade do sistema equilibrar, como será mostrado na parte de resultados. O algoritmo inicial consiste na seguinte ideia: No estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, seleciona-se aleatoriamente um sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. A partir dele, é sorteado um de seus vizinhos, digamos, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, com o qual haverá a troca de valor. Antes que ocorra a troca, são calculados os valores de dois Hamiltonianos: o que relaciona o sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; com seus vizinhos e o que relaciona &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; com seus vizinhos. Somados, eles representam o valor de &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt;. Após a troca, esses valores são recalculados, formando o valor de &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt;. Com esses valores, segue-se o cálculo da probabilidade da forma usual. &lt;br /&gt;
&lt;br /&gt;
Após verificar que a dinâmica inicialmente escolhida não era apropriada, optou-se por usar o algoritmo de Kawasaki tradicional, fazendo uso de uma listagem de quais eram os estados dos sítios e escolhendo os pares a serem trocados sempre como sítios de estados diferentes. Isso faz com que a aceitação do algoritmo de Monte Carlo seja muito mais elevada que ao do nosso algoritmo inicial, pois no caso em que grandes clusters são formados as trocas eram sempre rejeitadas de acordo com a dinâmica inicial.&lt;br /&gt;
&lt;br /&gt;
===Considerações práticas===&lt;br /&gt;
&lt;br /&gt;
Já consideramos os aspectos iniciais do método de Monte Carlo, mostrando suas aplicações. Vimos, do mesmo modo, a utilização do algoritmo de Metrópolis, dentro do qual aplicamos o algoritmo de Kawasaki (modificado) para desenvolver o sistema do gás de rede. Resta elucidar a função do parâmetro temporal, isto é, como as iterações desses algoritmos influenciam o sistema. Primeiramente, deve-se fixar um valor para o número de passos temporais que serão realizados. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações  do algoritmo de Metrópolis, abordado acima, sendo &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; o lado da rede quadrada. Chamamos de Passo de Monte Carlo (MCS) cada um desses passos temporais. Em outras palavras: em cada passo de Monte Carlo, todos os sítios tem a possibilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
=== Eficiência da dinâmica local ===&lt;br /&gt;
&lt;br /&gt;
Como mencionado acima, a primeira dinâmica escolhida foi a que restringe os sítios a trocarem de estado para apenas aqueles que são vizinhos próximos (os 4 acima, abaixo, a direita e a esquerda). Se verificou ao analisar os dados das simulações que na verdade essa dinâmica não era apropriada, pois a aceitação do algoritmo é muito baixa e com a amostragem escolhida (&amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS) o sistema ainda não estaria equilibrado. Isso pode ser percebido mais facilmente observando os histogramas das simulações. Sabe-se que a distribuição das grandezas macroscópicas de um sistema termodinâmico é a distribuição de Boltzmann &amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, então se espera para o sistema analisado que a energia tenha uma distribuição normal de frequências. Observe a diferença entre as distribuições para a energia do sistema no caso da dinâmica local inicialmente escolhida e no caso do algoritmo tradicional de Kawasaki:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Diferença entre distribuições para a energia do sistema por dinâmica escolhida.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Assim podemos notar que o sistema não está equilibrado após a amostragem com a dinâmica local. No caso do algoritmo tradicional o sistema se encontra em equilíbrio. A referência na qual esse trabalho mais se inspira, Monte Carlo Methods in Statistical Physics, de Newman e Barkema, não dá a devida ênfase para quão interessante computacionalmente é se manter na linguagem do modelo de Ising e adotar o algoritmo de Kawasaki.&lt;br /&gt;
É importante notar que as simulações da dinâmica de Kawasaki foram feitas na linguagem do modelo de Ising, com spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, ao invés de sítios ocupados por partículas &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; e sítios desocupados &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Essa mudança é importante para entender a mudança na escala das grandezas entre as simulações. Como a constante de interação &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; do modelo de Ising é um quarto da constante &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, a temperatura e a energia no modelo de Ising valem &amp;lt;math&amp;gt;\frac{1}{4}&amp;lt;/math&amp;gt; da temperatura e da energia nas simulações com a dinâmica local na linguagem do gás de rede.&lt;br /&gt;
&lt;br /&gt;
=== Energia e efeito do tamanho da rede ===&lt;br /&gt;
&lt;br /&gt;
A grandeza que foi medida nas simulações é a energia total do sistema. Para analisar os efeitos do tamanho da rede devemos comparar os valores das energias por número de sítios, já que quanto maior a rede maior o número de partículas e portanto maior o valor absoluto da energia. Abaixo temos um gráfico com os valores da energia total do sistema por número de sítios em função da temperatura, com os dados das três redes simuladas (L = 16, 32, 64).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:energia.png|thumb|center|none|alt=Alt text|Energia total do sistema dividida pelo número de sítios em função da temperatura para redes de tamanhos diferentes. Cada ponto no gráfico é a média de 5 amostragens com seu desvio padrão.|480px]]&lt;br /&gt;
&lt;br /&gt;
Aqui o comportamento da energia é como esperado para o modelo. Há uma queda no valor da energia conforme a temperatura do reservatório diminui abaixo da temperatura crítica, e conforme a temperatura aumenta acima da temperatura crítica, a energia aumenta mais devagar dado que é o estado em que o sistema está na sua fase amorfa.&lt;br /&gt;
&lt;br /&gt;
Algo que se nota no gráfico acima é a diferença nos valores da energia das redes &amp;lt;math&amp;gt;L = 32&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. É perceptível que as duas redes maiores apresentam valores de energia muito mais próximos. Isso se dá justamente pelo tamanho da rede e o fato da densidade ser a mesma.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:rede16.png|thumb|center|upright=4|none|alt= Alt text|Diagrama ilustrando o estado de menor energia para a rede de 16. As cores indicam o número de sítios vizinhos ocupados.|480px]]&lt;br /&gt;
&lt;br /&gt;
Para entender como o valor da energia total do sistema por número de sítios varia com o tamanho da rede é interessante calcular essa grandeza no estado de menor energia. No caso da rede quadrada, o estado de menor energia é um cluster quadrado. Como ilustrado no diagrama acima, existem sítios com 3 vizinhos ocupados e sítios com 2 vizinhos ocupados. Estes são os da borda do cluster. Todos os outros internos ao cluster tem 4 vizinhos ocupados e portanto contribuem com &amp;lt;math&amp;gt;-4\epsilon&amp;lt;/math&amp;gt; para o Hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
Nesse trabalho adotamos &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt;, o que facilita o cálculo da energia total, pois o tamanho do lado do cluster é &amp;lt;math&amp;gt; l = \sqrt{\frac{L^2}{4}}&amp;lt;/math&amp;gt;. Temos &amp;lt;math&amp;gt;(l - 2)^2&amp;lt;/math&amp;gt; partículas internas ao cluster e portanto com 4 vizinhos e &amp;lt;math&amp;gt;4(l - 2)&amp;lt;/math&amp;gt; partículas nas bordas com 3 vizinhos. O Hamiltoniano é portanto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = (-2\epsilon)*4 + (-3\epsilon)*4(l - 2) + (-4\epsilon)(l - 2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O primeiro termo é a referente às interações dos 4 cantos do cluster, que tem apenas 2 vizinhos ocupados. Abrindo os termos e simplificando a equação chegamos ao valor do Hamiltoniano do estado de menor energia do gás de rede:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = -(L^2 - 2L)\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo por 2 para encontrar o valor da energia total e então por &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;e = \frac{E}{L^2} = - \frac{\epsilon}{2} + \frac{\epsilon}{L}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
que é a grandeza apresentada no gráfico anterior. Essa elaboração foi feita para o modelo do gás de rede, porém as simulações foram feitas com o modelo de Ising, com a restrição de que a magnetização era constante (a quantidade de spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é constante).&lt;br /&gt;
&lt;br /&gt;
Usando a equação &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;J = \frac{\epsilon}{4}&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J\sum{i}s_i - 4JL^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utilizamos então a equação &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt; e percebemos que os termos do meio e da direita se cancelam, deixando somente o primeiro termo para avaliarmos em termos do estado de menor energia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J(2\rho - 1)L^2 - 4JL^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; = -J\sum_{\langle i, j \rangle}s_i s_j &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora podemos avaliar o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições. Para isso podemos nos basear no diagrama usado anteriormente, com a ressalva de que os sítios imediatamente fora do cluster também interagem com ele, já que temos agora spins &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; ao invés de sítios vazios. Temos o mesmo número de spins internos ao cluster que de pariculas anteriormente, assim como para as bordas do cluster e os mesmos quatro cantos. Além disso, os sítios fora do cluster também tem contribuição para o Hamiltoniano. O número de spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;L^2 - \frac{L^2}{4} - 2L&amp;lt;/math&amp;gt; e o número de spins fora do cluster com 1 vizinho &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;2L&amp;lt;/math&amp;gt;. Agora podemos somar todas essas contribuições.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = (-4J)(L^2 - \frac{L^2}{4} - 2L) + (-2J)(2L) + (-2J)*4(\frac{L}{2} - 2) + (-4J)(\frac{L}{2} - 2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da esquerda para a direita os termos são a contribuição dos spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, dos spins fora do cluster mas com um vizinho no cluster, dos spins na borda do cluster e dos spins interiores ao cluster. Abrindo os termos e simplificando a equação chegamos finalmente em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -(4L^2 - 8L)J&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E como nas simulações foram utilizadas que &amp;lt;math&amp;gt;\epsilon = 1&amp;lt;/math&amp;gt; para o caso do gás de rede e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt; para o modelo de Ising, temos portanto que as energias medidas com o modelo de Ising são equivalentes a 4 vezes as energias no modelo do gás de rede, como se verificou ao implementar a mesma função de medida para a linguagem de spins e de sítios vazios e ocupados. E com essa equação para o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições podemos perceber que o efeito do tamanho de rede é praticamente o mesmo, com a ressalva de que a energia por sítio deve ser também 4 vezes a energia por sítio do modelo do gás de rede.&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
&lt;br /&gt;
Passamos pelo que vem a ser o modelo do gás de rede na rede quadrada e apresentamos sua relação com o modelo de Ising. O Hamiltoniano do modelo do gás de rede nos mostra que ele é idêntico ao modelo de Ising com um termo de campo magnético externo. Ao fixarmos a densidade do modelo do gás de rede, impomos a restrição de que o modelo de Ising deve ter a magnetização constante para mantermos a equivalência. Também se discutiu o efeito do tamanho das redes simuladas e vimos que quanto maior o tamanho da rede mais próximo será o valor das energias por sítio em comparação com redes de tamanhos similares e vimos que isso se deve pelo fato do número de sítios no cluster do estado de menor energia crescer mais rápido no interior do cluster do que em seu perímetro.&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é a temperatura do banho térmico e o terceiro é a semente utilizada pelo gerador de números pseudo-aleatórios. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DGNU prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede com Densidade Constante e dinâmica local]]&lt;br /&gt;
&lt;br /&gt;
[[Modelo de ising com magnetização constante e algoritmo de Kawasaki]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3101</id>
		<title>Gás de Rede 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3101"/>
		<updated>2020-11-26T19:11:01Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Este trabalho tem o intuito de apresentar uma descrição do modelo do Gás de Rede bidimensional e traçar paralelos com o modelo de Ising, discutindo a relação entre seus Hamiltonianos.&lt;br /&gt;
&lt;br /&gt;
== Gás de Rede ==&lt;br /&gt;
&lt;br /&gt;
O Modelo do Gás de Rede 2D consiste em um sistema de &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas da forma &amp;lt;math&amp;gt;\sigma = {\sigma_1, \sigma_1, \dotsc, \sigma_N}&amp;lt;/math&amp;gt; onde cada sítio da rede pode assumir o valor &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, ocupado por uma partícula, ou &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;, não ocupado por uma partícula. A energia total do sistema é dada pelo Hamiltoniano do Gás de Rede, descrito pela equação&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \epsilon \sum_{\langle i,j \rangle} \sigma_i \sigma_j \qquad (1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde o somatório é dado entre os quatro vizinhos mais próximos e &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; é a constante de interação entre as partículas, para &amp;lt;math&amp;gt;\epsilon \geq 0&amp;lt;/math&amp;gt; a interação é atrativa. Por se tratar de uma rede quadrada com &amp;lt;math&amp;gt;L^2 = L \times L&amp;lt;/math&amp;gt; sítios, apenas uma parcela da rede é ocupada por partículas, ou seja, possuímos uma densidade constante &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; de partículas. Podemos expressar a condição da densidade constante da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} \sigma_i = \rho L^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazendo uma mudança de variáveis da forma &amp;lt;math&amp;gt;s_i = 2 \sigma_i - 1&amp;lt;/math&amp;gt; saímos da situação de ocupação e não ocupação de sítios e obtemos variáveis do Modelo de Ising &amp;lt;ref name=ISING&amp;gt; https://fiscomp.if.ufrgs.br/index.php/Ising_2D&amp;lt;/ref&amp;gt;, spins Up e Down. A variável &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; assume valor &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; (up) quando o sítio esta ocupado por uma partícula e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; quando não está. Aplicando a mudança de variáveis no Hamiltoniano do Gás de Rede obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} (s_i + 1)(s_j + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}[s_i s_j + s_i + s_j + 1]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Abrindo os termos dos três últimos somatórios se encontra que&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle}s_i = \sum_{\langle i,j \rangle}s_j = z \sum_{i}s_i&amp;lt;/math&amp;gt;, e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle} 1 = z L^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
o que simplifica a expressão para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{2} \epsilon z \sum_{i} s_i - \frac{1}{4} \epsilon z L^2 \qquad (2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; é o número de coordenação, isto é, o número de vizinhos de cada sítio, que para a rede quadrada é 4. Note a mudança no índice do somatório de &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Vemos que este Hamiltoniano possui a forma do Hamiltoniano do modelo de Ising com aplicação de um campo magnético externo, a menos de uma constante. Entretanto, com a densidade constante, fazendo a mesma mudança de variáveis, obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} s_i = (2\rho - 1) L^2 \qquad (3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicando essa relação no Hamiltoniano obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} s_i s_j - z \epsilon L^2 \rho  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; são constantes, o segundo termo é constante. Definindo &amp;lt;math&amp;gt;J = \epsilon / 4&amp;lt;/math&amp;gt; o Hamiltoniano se torna&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - J \sum_{\langle i,j \rangle} s_i s_j + \text{constante}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A constante não influencia nos valores da medida, pois ela se cancela na equação de mudança de estado &amp;lt;ref name=BARKEMA&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;. Vemos que, ao assumir a densidade constante, o modelo do Gás de Rede se torna o modelo de Ising sem a presença de um campo magnético. A condição da densidade constante é a magnetização total do modelo. &lt;br /&gt;
&lt;br /&gt;
É interessante notar que podemos tratar o modelo do gás de rede de duas formas: &#039;&#039;&#039;(a)&#039;&#039;&#039; assumir a densidade constante e utilizar o primeiro Hamiltoniano apresentado, ou &#039;&#039;&#039;(b)&#039;&#039;&#039; não assumir a densidade constante, aplicar a mudança de variáveis discutida e utilizar o Hamiltoniano que possuí a forma de Ising com campo magnético.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Método de Monte Carlo==&lt;br /&gt;
&lt;br /&gt;
===Princípios gerais===&lt;br /&gt;
&lt;br /&gt;
Para desenvolver a dinâmica do gás de rede, isto é, fazer com que ocorram alterações na posição das partículas, recorre-se ao método de Monte Carlo. Trata-se, em linhas gerais, de um método estatístico baseado em amostragem aleatória. É comum, ao introduzir-se o assunto, utilizar problemas de cálculo de áreas, como, por exemplo, a clássica história das crianças que desenharam, na areia, um círculo contido em um quadrado, de modo que o diâmetro do círculo seja igual ao lado do quadrado. Jogam, aleatoriamente, pedras no quadrado. Após uma grande quantidade de arremessos, compara-se o valor de pedras que estão dentro do círculo com o número total dentro do quadrado, fazendo a razão entre esses dois valores, encontra-se uma aproximação para a razão entre a área do círculo e a do quadrado, que equivale a &amp;lt;math&amp;gt;\pi/4&amp;lt;/math&amp;gt;. Desse modo, pode ser encontrada uma aproximação do valor de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; através do método de Monte Carlo, que simula uma aproximação experimental&amp;lt;ref name=KRAUTH&amp;gt;Krauth ,W. ,&amp;quot;Statistical Mechanics: Algorithms and Computations&amp;quot;. Oxford Master Series in Physics, Oxford University Press, 2006.&amp;lt;/ref&amp;gt;. É possível propor um novo modelo, no qual o quadrado é grande e as pedras são atiradas aleatoriamente de dentro do quadrado, de modo que a posição de arremesso é atualizada para a posição da última pedra jogada. A principal alteração nesse método é a possibilidade de que uma pedra seja atirada para fora do quadrado. Nesse caso, a posição para o próximo arremesso não muda e as pedras que foram parar fora das bordas do quadrado são empilhadas naquela posição. Essas mudanças no método caracterizam a aplicação de Monte Carlo em uma cadeia de Markov, definida de modo que a configuração do próximo estado depende somente da configuração atual. Até aqui, vimos o método de Monte Carlo aplicado em situações nas quais a probabilidade de um evento ocorrer na configuração subsequente do sistema é zero ou um. Para novas distribuições de probabilidade, utiliza-se o algoritmo de Metrópolis.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo de Metrópolis===&lt;br /&gt;
&lt;br /&gt;
Como mencionado, o método de Monte Carlo funciona através de atualizações em um sistema, fazendo com que ele passe de um estado para outro. Consideremos &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; como sendo o estado atual do sistema. O próximo estado será chamado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Chamamos a probabilidade do sistema passar do estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt;. A ideia do algoritmo de Metrópolis é aplicar essa probabilidade no método de Monte Carlo. Para isso, um método muito utilizado é calcular a probabilidade &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt; e compará-la a um número aleatório &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, de modo que &amp;lt;math&amp;gt;0&amp;lt;r&amp;lt;1&amp;lt;/math&amp;gt;. Se &amp;lt;math&amp;gt; p(\mu\to\nu)&amp;gt;r&amp;lt;/math&amp;gt;, então o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é adotado pelo sistema. Para aplicar essas ideias ao problema do gás de rede, o método mais simples é utilizando o algoritmo de Kawasaki, que faz com que dois sítios, selecionados aleatoriamente, tenham seus valores trocados. Isso implica que a magnetização do sistema será constante&amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;. Para calcular a probabilidade de aceitação dessa mudança, calcula-se a variação de energia entre os estados,&amp;lt;math&amp;gt;\Delta E= E_{\nu}-E_{\mu}&amp;lt;/math&amp;gt;, e aplica-se o valor obtido na equação de probabilidade de aceitação de Metrópolis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\mu\to\nu)=\left\{\begin{array}{rc} e^{\frac{-\Delta E}{k_BT}}, \quad \text{se}\quad \Delta E&amp;gt;0\\&lt;br /&gt;
1, \quad \text{caso contrario}\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, inicialmente foram feitas algumas alterações no algoritmo de Kawasaki. Limita-se a troca de valores somente entre um sítio e seus quatro vizinhos principais (isto é, acima, abaixo, à direita e à esquerda). Isso porque se tinha a intenção de recriar o comportamento difusivo de um gás no modelo do gás de rede em duas dimensões, porém, essa escolha para a dinâmica das simulações limita em muito a facilidade do sistema equilibrar, como será mostrado na parte de resultados. O algoritmo inicial consiste na seguinte ideia: No estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, seleciona-se aleatoriamente um sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. A partir dele, é sorteado um de seus vizinhos, digamos, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, com o qual haverá a troca de valor. Antes que ocorra a troca, são calculados os valores de dois Hamiltonianos: o que relaciona o sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; com seus vizinhos e o que relaciona &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; com seus vizinhos. Somados, eles representam o valor de &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt;. Após a troca, esses valores são recalculados, formando o valor de &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt;. Com esses valores, segue-se o cálculo da probabilidade da forma usual. &lt;br /&gt;
&lt;br /&gt;
Após verificar que a dinâmica inicialmente escolhida não era apropriada, optou-se por usar o algoritmo de Kawasaki tradicional, fazendo uso de uma listagem de quais eram os estados dos sítios e escolhendo os pares a serem trocados sempre como sítios de estados diferentes. Isso faz com que a aceitação do algoritmo de Monte Carlo seja muito mais elevada que ao do nosso algoritmo inicial, pois no caso em que grandes clusters são formados as trocas eram sempre rejeitadas de acordo com a dinâmica inicial.&lt;br /&gt;
&lt;br /&gt;
===Considerações práticas===&lt;br /&gt;
&lt;br /&gt;
Já consideramos os aspectos iniciais do método de Monte Carlo, mostrando suas aplicações. Vimos, do mesmo modo, a utilização do algoritmo de Metrópolis, dentro do qual aplicamos o algoritmo de Kawasaki (modificado) para desenvolver o sistema do gás de rede. Resta elucidar a função do parâmetro temporal, isto é, como as iterações desses algoritmos influenciam o sistema. Primeiramente, deve-se fixar um valor para o número de passos temporais que serão realizados. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações  do algoritmo de Metrópolis, abordado acima, sendo &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; o lado da rede quadrada. Chamamos de Passo de Monte Carlo (MCS) cada um desses passos temporais. Em outras palavras: em cada passo de Monte Carlo, todos os sítios tem a possibilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
=== Eficiência da dinâmica local ===&lt;br /&gt;
&lt;br /&gt;
Como mencionado acima, a primeira dinâmica escolhida foi a que restringe os sítios a trocarem de estado para apenas aqueles que são vizinhos próximos (os 4 acima, abaixo, a direita e a esquerda). Se verificou ao analisar os dados das simulações que na verdade essa dinâmica não era apropriada, pois a aceitação do algoritmo é muito baixa e com a amostragem escolhida (&amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS) o sistema ainda não estaria equilibrado. Isso pode ser percebido mais facilmente observando os histogramas das simulações. Sabe-se que a distribuição das grandezas macroscópicas de um sistema termodinâmico é a distribuição de Boltzmann &amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, então se espera para o sistema analisado que a energia tenha uma distribuição normal de frequências. Observe a diferença entre as distribuições para a energia do sistema no caso da dinâmica local inicialmente escolhida e no caso do algoritmo tradicional de Kawasaki:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Diferença entre distribuições para a energia do sistema por dinâmica escolhida.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Assim podemos notar que o sistema não está equilibrado após a amostragem com a dinâmica local. No caso do algoritmo tradicional o sistema se encontra em equilíbrio. A referência na qual esse trabalho mais se inspira, Monte Carlo Methods in Statistical Physics, de Newman e Barkema, não dá a devida ênfase para quão interessante computacionalmente é se manter na linguagem do modelo de Ising e adotar o algoritmo de Kawasaki.&lt;br /&gt;
É importante notar que as simulações da dinâmica de Kawasaki foram feitas na linguagem do modelo de Ising, com spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, ao invés de sítios ocupados por partículas &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; e sítios desocupados &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Essa mudança é importante para entender a mudança na escala das grandezas entre as simulações. Como a constante de interação &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; do modelo de Ising é um quarto da constante &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, a temperatura e a energia no modelo de Ising valem &amp;lt;math&amp;gt;\frac{1}{4}&amp;lt;/math&amp;gt; da temperatura e da energia nas simulações com a dinâmica local na linguagem do gás de rede.&lt;br /&gt;
&lt;br /&gt;
=== Energia e efeito do tamanho da rede ===&lt;br /&gt;
&lt;br /&gt;
A grandeza que foi medida nas simulações é a energia total do sistema. Para analisar os efeitos do tamanho da rede devemos comparar os valores das energias por número de sítios, já que quanto maior a rede maior o número de partículas e portanto maior o valor absoluto da energia. Abaixo temos um gráfico com os valores da energia total do sistema por número de sítios em função da temperatura, com os dados das três redes simuladas (L = 16, 32, 64).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:energia.png|thumb|center|none|alt=Alt text|Energia total do sistema dividida pelo número de sítios em função da temperatura para redes de tamanhos diferentes. Cada ponto no gráfico é a média de 5 amostragens com seu desvio padrão.|480px]]&lt;br /&gt;
&lt;br /&gt;
Aqui o comportamento da energia é como esperado para o modelo. Há uma queda no valor da energia conforme a temperatura do reservatório diminui abaixo da temperatura crítica, e conforme a temperatura aumenta acima da temperatura crítica, a energia aumenta mais devagar dado que é o estado em que o sistema está na sua fase amorfa.&lt;br /&gt;
&lt;br /&gt;
Algo que se nota no gráfico acima é a diferença nos valores da energia das redes &amp;lt;math&amp;gt;L = 32&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. É perceptível que as duas redes maiores apresentam valores de energia muito mais próximos. Isso se dá justamente pelo tamanho da rede e o fato da densidade ser a mesma.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:rede16.png|thumb|center|upright=4|none|alt= Alt text|Diagrama ilustrando o estado de menor energia para a rede de 16. As cores indicam o número de sítios vizinhos ocupados.|480px]]&lt;br /&gt;
&lt;br /&gt;
Para entender como o valor da energia total do sistema por número de sítios varia com o tamanho da rede é interessante calcular essa grandeza no estado de menor energia. No caso da rede quadrada, o estado de menor energia é um cluster quadrado. Como ilustrado no diagrama acima, existem sítios com 3 vizinhos ocupados e sítios com 2 vizinhos ocupados. Estes são os da borda do cluster. Todos os outros internos ao cluster tem 4 vizinhos ocupados e portanto contribuem com &amp;lt;math&amp;gt;-4\epsilon&amp;lt;/math&amp;gt; para o Hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
Nesse trabalho adotamos &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt;, o que facilita o cálculo da energia total, pois o tamanho do lado do cluster é &amp;lt;math&amp;gt; l = \sqrt{\frac{L^2}{4}}&amp;lt;/math&amp;gt;. Temos &amp;lt;math&amp;gt;(l - 2)^2&amp;lt;/math&amp;gt; partículas internas ao cluster e portanto com 4 vizinhos e &amp;lt;math&amp;gt;4(l - 2)&amp;lt;/math&amp;gt; partículas nas bordas com 3 vizinhos. O Hamiltoniano é portanto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = (-2\epsilon)*4 + (-3\epsilon)*4(l - 2) + (-4\epsilon)(l - 2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O primeiro termo é a referente às interações dos 4 cantos do cluster, que tem apenas 2 vizinhos ocupados. Abrindo os termos e simplificando a equação chegamos ao valor do Hamiltoniano do estado de menor energia do gás de rede:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = -(L^2 - 2L)\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo por 2 para encontrar o valor da energia total e então por &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;e = \frac{E}{L^2} = - \frac{\epsilon}{2} + \frac{\epsilon}{L}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
que é a grandeza apresentada no gráfico anterior. Essa elaboração foi feita para o modelo do gás de rede, porém as simulações foram feitas com o modelo de Ising, com a restrição de que a magnetização era constante (a quantidade de spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é constante).&lt;br /&gt;
&lt;br /&gt;
Usando a equação &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;J = \frac{\epsilon}{4}&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J\sum{i}s_i - 4JL^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utilizamos então a equação &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt; e percebemos que os termos do meio e da direita se cancelam, deixando somente o primeiro termo para avaliarmos em termos do estado de menor energia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J(2\rho - 1)L^2 - 4JL^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; = -J\sum_{\langle i, j \rangle}s_i s_j &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora podemos avaliar o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições. Para isso podemos nos basear no diagrama usado anteriormente, com a ressalva de que os sítios imediatamente fora do cluster também interagem com ele, já que temos agora spins &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; ao invés de sítios vazios. Temos o mesmo número de spins internos ao cluster que de pariculas anteriormente, assim como para as bordas do cluster e os mesmos quatro cantos. Além disso, os sítios fora do cluster também tem contribuição para o Hamiltoniano. O número de spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;L^2 - \frac{L^2}{4} - 2L&amp;lt;/math&amp;gt; e o número de spins fora do cluster com 1 vizinho &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;2L&amp;lt;/math&amp;gt;. Agora podemos somar todas essas contribuições.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = (-4J)(L^2 - \frac{L^2}{4} - 2L) + (-2J)(2L) + (-2J)*4(\frac{L}{2} - 2) + (-4J)(\frac{L}{2} - 2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da esquerda para a direita os termos são a contribuição dos spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, dos spins fora do cluster mas com um vizinho no cluster, dos spins na borda do cluster e dos spins interiores ao cluster. Abrindo os termos e simplificando a equação chegamos finalmente em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -(4L^2 - 8L)J&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E como nas simulações foram utilizadas que &amp;lt;math&amp;gt;\epsilon = 1&amp;lt;/math&amp;gt; para o caso do gás de rede e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt; para o modelo de Ising, temos portanto que as energias medidas com o modelo de Ising são equivalentes a 4 vezes as energias no modelo do gás de rede, como se verificou ao implementar a mesma função de medida para a linguagem de spins e de sítios vazios e ocupados.&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é a temperatura do banho térmico e o terceiro é a semente utilizada pelo gerador de números pseudo-aleatórios. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DGNU prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede com Densidade Constante e dinâmica local]]&lt;br /&gt;
&lt;br /&gt;
[[Modelo de ising com magnetização constante e algoritmo de Kawasaki]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_ising_com_magnetiza%C3%A7%C3%A3o_constante_e_algoritmo_de_Kawasaki&amp;diff=3100</id>
		<title>Modelo de ising com magnetização constante e algoritmo de Kawasaki</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Modelo_de_ising_com_magnetiza%C3%A7%C3%A3o_constante_e_algoritmo_de_Kawasaki&amp;diff=3100"/>
		<updated>2020-11-26T19:09:32Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: Criou página com &amp;#039;&amp;lt;source lang = &amp;quot;c&amp;quot;&amp;gt; /* beta = inverse temperature * prob[] = array of acceptance probabilities * s[] = lattice of spins with helical boundary conditions * up[] = list of up-po...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* beta = inverse temperature&lt;br /&gt;
* prob[] = array of acceptance probabilities&lt;br /&gt;
* s[] = lattice of spins with helical boundary conditions&lt;br /&gt;
* up[] = list of up-pointing spins&lt;br /&gt;
* down[] = list of down-pointing spins&lt;br /&gt;
* nup = number of up-pointing spins&lt;br /&gt;
* ndown = number of down-pointing spins&lt;br /&gt;
* L = constant edge length of lattice&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;quot;mc.h&amp;quot;&lt;br /&gt;
#define LSIZE 16&lt;br /&gt;
#define L2    (LSIZE*LSIZE)&lt;br /&gt;
//#define TEMP  2.8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void gnuplot_view(void);&lt;br /&gt;
void confere_densidade(long int tempo);&lt;br /&gt;
void confere_energia(long int tempo);&lt;br /&gt;
void confere_energia_densidade(long int tempo);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int s[L2], viz[L2][4] ;&lt;br /&gt;
int up[L2], down[L2] ;&lt;br /&gt;
int nup,ndown;&lt;br /&gt;
int ET;&lt;br /&gt;
int MCS;&lt;br /&gt;
double prob[17];&lt;br /&gt;
double TEMP;&lt;br /&gt;
//double beta=1.0/TEMP;&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
void initialize() {&lt;br /&gt;
&lt;br /&gt;
  int i,n1,n2,n3,n4,L; &lt;br /&gt;
  &lt;br /&gt;
  // probs&lt;br /&gt;
  for (i=0; i&amp;lt;17; i++) {&lt;br /&gt;
    prob[i] = exp(-i/(1.0*TEMP));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // viz&lt;br /&gt;
  L = LSIZE;&lt;br /&gt;
  for(i=0;i&amp;lt;L2;i++) {&lt;br /&gt;
    n1 = ((i/L -1 +L2)%L)*L+i%L;&lt;br /&gt;
    n2 = ((i/L)%L)*L+(i+1+L)%L;&lt;br /&gt;
    n3 = ((i/L +1 +L2)%L)*L+i%L;&lt;br /&gt;
    n4 = ((i/L)%L)*L+(i-1+L)%L;&lt;br /&gt;
    &lt;br /&gt;
    viz[i][0] = n1;&lt;br /&gt;
    viz[i][1] = n2;&lt;br /&gt;
    viz[i][2] = n3;&lt;br /&gt;
    viz[i][3] = n4;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // estado -- lembrar que esta versao esta formulada em termos de s= +- 1 (ising)&lt;br /&gt;
  nup = 0;&lt;br /&gt;
  ndown = 0;&lt;br /&gt;
  for(i=0;i&amp;lt;L2;i++) {&lt;br /&gt;
    up[i] = 0;&lt;br /&gt;
    down[i] = 0;&lt;br /&gt;
    if((rand()/(double) RAND_MAX)&amp;lt;0.25) {&lt;br /&gt;
      s[i] = 1;&lt;br /&gt;
      up[nup] = i;&lt;br /&gt;
      nup++;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      s[i]=-1;&lt;br /&gt;
      down[ndown] = i;&lt;br /&gt;
      ndown++;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ET = 0;&lt;br /&gt;
  for(i = 0; i &amp;lt; L2; i++){&lt;br /&gt;
	ET += (s[viz[i][0]] + s[viz[i][1]] + s[viz[i][2]] + s[viz[i][3]])*s[i];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ET = -ET/2;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
void sweep(long int tempo) {&lt;br /&gt;
  &lt;br /&gt;
  int i;&lt;br /&gt;
  int delta;&lt;br /&gt;
  int iup,idown;&lt;br /&gt;
  int xup,xdown;&lt;br /&gt;
  int upnn1,upnn2,upnn3,upnn4;&lt;br /&gt;
  int downnn1,downnn2,downnn3,downnn4;&lt;br /&gt;
  int term1,term2;&lt;br /&gt;
  double fprob,frand,frand1,frand2;&lt;br /&gt;
  &lt;br /&gt;
  for (i=0; i&amp;lt;L2; i++) {&lt;br /&gt;
&lt;br /&gt;
    /* Choose a pair of spins */&lt;br /&gt;
    iup = rand()%nup;&lt;br /&gt;
    idown = rand()%ndown; &lt;br /&gt;
    //&lt;br /&gt;
    xup = up[iup];&lt;br /&gt;
    xdown = down[idown];&lt;br /&gt;
    &lt;br /&gt;
    upnn1 = viz[xup][0];&lt;br /&gt;
    upnn2 = viz[xup][1];&lt;br /&gt;
    upnn3 = viz[xup][2];&lt;br /&gt;
    upnn4 = viz[xup][3];&lt;br /&gt;
    downnn1 = viz[xdown][0];&lt;br /&gt;
    downnn2 = viz[xdown][1];&lt;br /&gt;
    downnn3 = viz[xdown][2];&lt;br /&gt;
    downnn4 = viz[xdown][3];&lt;br /&gt;
    &lt;br /&gt;
    /* Calculate the local energies before swapping */&lt;br /&gt;
    term1 = s[upnn1]+s[upnn2]+s[upnn3]+s[upnn4];&lt;br /&gt;
    term2 = -s[downnn1]-s[downnn2]-s[downnn3]-s[downnn4];&lt;br /&gt;
&lt;br /&gt;
    /* Swap the spins over */&lt;br /&gt;
    s[xup] = -1;&lt;br /&gt;
    s[xdown] = +1;&lt;br /&gt;
&lt;br /&gt;
    /* Calculate the difference in the local energies after */&lt;br /&gt;
    // original&lt;br /&gt;
    term1 -= -s[upnn1]-s[upnn2]-s[upnn3]-s[upnn4] ;&lt;br /&gt;
    // modificado por clareza&lt;br /&gt;
    //term1 += s[upnn1]+s[upnn2]+s[upnn3]+s[upnn4];&lt;br /&gt;
    // original&lt;br /&gt;
    term2 -= s[downnn1]+s[downnn2]+s[downnn3]+s[downnn4];&lt;br /&gt;
    // modificado por clareza&lt;br /&gt;
    //term2 += -s[downnn1]-s[downnn2]-s[downnn3]-s[downnn4];&lt;br /&gt;
&lt;br /&gt;
    /* Calculate total change in energy */&lt;br /&gt;
    delta = term1 + term2;&lt;br /&gt;
&lt;br /&gt;
    /* Accept or reject the move */&lt;br /&gt;
    fprob = prob[delta];&lt;br /&gt;
    frand = rand()/(double) RAND_MAX;&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    if (delta&amp;lt;=0) {&lt;br /&gt;
      up[iup] = xdown;&lt;br /&gt;
      down[idown] = xup;&lt;br /&gt;
      ET = ET + delta;	// MEDIDA DE ENERGIA&lt;br /&gt;
    }&lt;br /&gt;
    else if (frand &amp;lt; fprob) {&lt;br /&gt;
      up[iup] = xdown;&lt;br /&gt;
      down[idown] = xup;&lt;br /&gt;
      ET = ET + delta;	// MEDIDA DE ENERGIA&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      s[xup] = +1;&lt;br /&gt;
      s[xdown] = -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void sweep_local(void){&lt;br /&gt;
&lt;br /&gt;
	int i;&lt;br /&gt;
	int Ei, Ef;&lt;br /&gt;
	int delta;&lt;br /&gt;
	int iup,idown;&lt;br /&gt;
	int xup,xdown;&lt;br /&gt;
	int upnn1,upnn2,upnn3,upnn4;&lt;br /&gt;
	int downnn1,downnn2,downnn3,downnn4;&lt;br /&gt;
	int term1,term2;&lt;br /&gt;
&lt;br /&gt;
	for (i=0; i&amp;lt;L2; i++) {&lt;br /&gt;
&lt;br /&gt;
		/* Choose a pair of spins */&lt;br /&gt;
		iup = L2*(rand()/(double) RAND_MAX);&lt;br /&gt;
		idown = 4*(rand()/(double) RAND_MAX);&lt;br /&gt;
		xup = iup;&lt;br /&gt;
		xdown = viz[xup][idown];&lt;br /&gt;
&lt;br /&gt;
		if(s[xup] != s[xdown]){&lt;br /&gt;
		&lt;br /&gt;
		  upnn1 = viz[xup][0];&lt;br /&gt;
		  upnn2 = viz[xup][1];&lt;br /&gt;
		  upnn3 = viz[xup][2];&lt;br /&gt;
		  upnn4 = viz[xup][3];&lt;br /&gt;
		  downnn1 = viz[xdown][0];&lt;br /&gt;
		  downnn2 = viz[xdown][1];&lt;br /&gt;
		  downnn3 = viz[xdown][2];&lt;br /&gt;
		  downnn4 = viz[xdown][3];&lt;br /&gt;
		  &lt;br /&gt;
		  /* Calculate the local energies before swapping */&lt;br /&gt;
		  term1 = s[upnn1]+s[upnn2]+s[upnn3]+s[upnn4];&lt;br /&gt;
		  term2 = s[downnn1] + s[downnn2] + s[downnn3] + s[downnn4];&lt;br /&gt;
      Ei = -s[xup]*term1 - s[xdown]*term2;&lt;br /&gt;
		  &lt;br /&gt;
      term1 = term1 + s[xup] - s[xdown];&lt;br /&gt;
      term2 = term2 + s[xdown] - s[xup];&lt;br /&gt;
		&lt;br /&gt;
      &lt;br /&gt;
      Ef = -s[xdown]*term1 - s[xup]*term2;&lt;br /&gt;
&lt;br /&gt;
		  /* Calculate total change in energy */&lt;br /&gt;
      delta = Ef - Ei;&lt;br /&gt;
&lt;br /&gt;
		  /* Accept or reject the move */&lt;br /&gt;
		  if (delta&amp;lt;=0) {&lt;br /&gt;
        		s[xup] = -s[xup];&lt;br /&gt;
        		s[xdown] = -s[xdown];&lt;br /&gt;
			    ET += delta;	// MEDIDA DE ENERGIA&lt;br /&gt;
		  }&lt;br /&gt;
		  else if ((rand()/(double) RAND_MAX) &amp;lt;prob [delta]) {&lt;br /&gt;
  		  		s[xup] = -s[xup];&lt;br /&gt;
      			s[xdown] = -s[xdown];&lt;br /&gt;
			    ET += delta;	// MEDIDA DE ENERGIA&lt;br /&gt;
 		}&lt;br /&gt;
		else {&lt;br /&gt;
&lt;br /&gt;
  		&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////	 &lt;br /&gt;
int main (int argc, char *argv[]) {&lt;br /&gt;
&lt;br /&gt;
  int steps;&lt;br /&gt;
  int SEMENTE;&lt;br /&gt;
  int TMAX, VIEW, TRAN;&lt;br /&gt;
  FILE *arq;&lt;br /&gt;
  char nome_do_arquivo[300];&lt;br /&gt;
  double temperatura;&lt;br /&gt;
&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
  temperatura = 2.8;&lt;br /&gt;
  TEMP = temperatura;&lt;br /&gt;
#else&lt;br /&gt;
  temperatura = atof(argv[1]);&lt;br /&gt;
  TEMP = temperatura;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
  TMAX=1E6;&lt;br /&gt;
  TRAN=1E5;&lt;br /&gt;
  VIEW=1;&lt;br /&gt;
&lt;br /&gt;
  /* seed = start_randomic(); */&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
  SEMENTE = 24242;&lt;br /&gt;
  srand(SEMENTE);&lt;br /&gt;
#else&lt;br /&gt;
  SEMENTE = atoi(argv[2]);&lt;br /&gt;
  srand(SEMENTE);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
  initialize();&lt;br /&gt;
  confere_energia_densidade(0); &lt;br /&gt;
  &lt;br /&gt;
  //TRANSIENTE&lt;br /&gt;
  for(steps=0; steps&amp;lt;TRAN; steps++){&lt;br /&gt;
#ifndef LOCAL&lt;br /&gt;
    sweep(steps);&lt;br /&gt;
#else&lt;br /&gt;
    sweep_local();&lt;br /&gt;
#endif&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
  sprintf(nome_do_arquivo, &amp;quot;series_backup.dat&amp;quot;);&lt;br /&gt;
#else&lt;br /&gt;
  sprintf(nome_do_arquivo, &amp;quot;series_%.3lf_%d.dat&amp;quot;, TEMP, SEMENTE);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
  arq = fopen(nome_do_arquivo, &amp;quot;w&amp;quot;);&lt;br /&gt;
  fprintf(arq, &amp;quot;#mcs ET S%d L%d\n&amp;quot;, SEMENTE, LSIZE);&lt;br /&gt;
  for(steps=0;steps&amp;lt;TMAX;steps++) {&lt;br /&gt;
#ifndef LOCAL&lt;br /&gt;
    sweep(steps);&lt;br /&gt;
    fprintf(arq, &amp;quot;%d %d\n&amp;quot;, steps, ET);&lt;br /&gt;
#else&lt;br /&gt;
    sweep_local();&lt;br /&gt;
#endif&lt;br /&gt;
#ifdef GNU&lt;br /&gt;
    MCS = steps;&lt;br /&gt;
    if(steps &amp;gt; 0) {&lt;br /&gt;
      gnuplot_view();&lt;br /&gt;
      confere_densidade(steps); &lt;br /&gt;
      confere_energia(steps); &lt;br /&gt;
    }&lt;br /&gt;
#endif&lt;br /&gt;
    //confere_densidade(steps); &lt;br /&gt;
    //confere_energia(steps);&lt;br /&gt;
    confere_energia_densidade(steps); &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 		    	       GNUPLOT VIEW		 	 	    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void gnuplot_view(void) {&lt;br /&gt;
&lt;br /&gt;
  int ii,jj,L;&lt;br /&gt;
&lt;br /&gt;
  L=LSIZE;&lt;br /&gt;
  &lt;br /&gt;
  //printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;, 2*(L-1), (L-1));&lt;br /&gt;
  //printf(&amp;quot;set cbrange [0:5]\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
  //printf(&amp;quot;set palette defined (0 &#039;black&#039;, 1 &#039;dark-violet&#039;)\n&amp;quot;);&lt;br /&gt;
  //printf(&amp;quot;unset colorbox\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;set title \&amp;quot;MCS = %d; ET = %d\&amp;quot;\n&amp;quot;, MCS, ET);&lt;br /&gt;
  //printf(&amp;quot;set size ratio 0.5\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;set key off\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;plot \&amp;quot;-\&amp;quot; matrix w image\n&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  for(jj=0;jj&amp;lt;L;jj++) {&lt;br /&gt;
    for(ii=0;ii&amp;lt;L;ii++) {&lt;br /&gt;
      printf(&amp;quot;%d &amp;quot;, s[ii + jj*L]);&lt;br /&gt;
      //	printf(&amp;quot;%d &amp;quot;, neigh[ii + jj*L][4]);&lt;br /&gt;
    }&lt;br /&gt;
    /*printf(&amp;quot;%d %d %d &amp;quot;,5,5,5);&lt;br /&gt;
    for(ii=0;ii&amp;lt;L;ii++)	{&lt;br /&gt;
      //printf(&amp;quot;%d &amp;quot;, site[ii + jj*L]);&lt;br /&gt;
      printf(&amp;quot;%d &amp;quot;, viz[ii + jj*L][4]);&lt;br /&gt;
    }&lt;br /&gt;
    */&lt;br /&gt;
    printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  //printf(&amp;quot;\ne\n pause 1.0\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;\ne\n pause 0.1\n&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 		    	       Confere densidade         	 	    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void confere_densidade(long int tempo) {&lt;br /&gt;
&lt;br /&gt;
  int i,dens_up,dens_down;&lt;br /&gt;
&lt;br /&gt;
  dens_up = 0;&lt;br /&gt;
  dens_down = 0;&lt;br /&gt;
  for(i=0;i&amp;lt;L2;i++) {&lt;br /&gt;
    if(s[i]==1) {&lt;br /&gt;
      dens_up++;&lt;br /&gt;
    }&lt;br /&gt;
    else if(s[i]==-1) {&lt;br /&gt;
      dens_down++;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if((dens_up!=nup)||(dens_down!=ndown)||(dens_up+dens_down!=L2)) {&lt;br /&gt;
    fprintf(stderr,&amp;quot;ERRO!!! no numero de particulas\n&amp;quot;);&lt;br /&gt;
    fprintf(stderr,&amp;quot;        tempo:     %ld\n&amp;quot;,tempo);&lt;br /&gt;
    fprintf(stderr,&amp;quot;        dens_up:   %d  nup:   %d\n&amp;quot;,dens_up,nup);&lt;br /&gt;
    fprintf(stderr,&amp;quot;        dens_down: %d  ndown: %d\n&amp;quot;,dens_down,ndown);&lt;br /&gt;
    fprintf(stderr,&amp;quot;        dens:      %d  n:     %d\n&amp;quot;,dens_up+dens_down,nup+ndown);&lt;br /&gt;
    exit(-1);&lt;br /&gt;
  }&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 		    	       Confere energia           	 	    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void confere_energia(long int tempo) {&lt;br /&gt;
&lt;br /&gt;
  int i,ene;&lt;br /&gt;
&lt;br /&gt;
  ene = 0;&lt;br /&gt;
  for(i = 0; i &amp;lt; L2; i++){&lt;br /&gt;
    ene += (s[viz[i][0]] + s[viz[i][1]] + s[viz[i][2]] + s[viz[i][3]])*s[i];&lt;br /&gt;
  }&lt;br /&gt;
  ene = -ene/2;&lt;br /&gt;
&lt;br /&gt;
  if(ene!=ET) {&lt;br /&gt;
    fprintf(stderr,&amp;quot;ERRO!!! na energia\n&amp;quot;);&lt;br /&gt;
    fprintf(stderr,&amp;quot;        tempo: %ld   ene: %d  ET: %d\n\n&amp;quot;,tempo,ene,ET);&lt;br /&gt;
    exit(-1);&lt;br /&gt;
  }&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 		      Confere energia e densidade           	 	    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void confere_energia_densidade(long int tempo) {&lt;br /&gt;
&lt;br /&gt;
  int i,ene,dens_up,dens_down;&lt;br /&gt;
&lt;br /&gt;
  dens_up = 0;&lt;br /&gt;
  dens_down = 0;&lt;br /&gt;
  for(i=0;i&amp;lt;L2;i++) {&lt;br /&gt;
    if(s[i]==1) {&lt;br /&gt;
      dens_up++;&lt;br /&gt;
    }&lt;br /&gt;
    else if(s[i]==-1) {&lt;br /&gt;
      dens_down++;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ene = 0;&lt;br /&gt;
  for(i = 0; i &amp;lt; L2; i++){&lt;br /&gt;
    ene += (s[viz[i][0]] + s[viz[i][1]] + s[viz[i][2]] + s[viz[i][3]])*s[i];&lt;br /&gt;
  }&lt;br /&gt;
  ene = -ene/2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if((dens_up!=nup)||(dens_down!=ndown)||(dens_up+dens_down!=L2)||(ene!=ET)) {&lt;br /&gt;
    fprintf(stderr,&amp;quot;ERRO!!! \n&amp;quot;);&lt;br /&gt;
    fprintf(stderr,&amp;quot;        tempo:     %ld\n&amp;quot;,tempo);&lt;br /&gt;
    fprintf(stderr,&amp;quot;        dens_up:   %d  nup:   %d\n&amp;quot;,dens_up,nup);&lt;br /&gt;
    fprintf(stderr,&amp;quot;        dens_down: %d  ndown: %d\n&amp;quot;,dens_down,ndown);&lt;br /&gt;
    fprintf(stderr,&amp;quot;        dens:      %d  n:     %d\n&amp;quot;,dens_up+dens_down,nup+ndown);&lt;br /&gt;
    fprintf(stderr,&amp;quot;        ene:       %d  ET:    %d\n\n&amp;quot;,ene,ET);&lt;br /&gt;
    exit(-1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_com_Densidade_Constante_e_din%C3%A2mica_local&amp;diff=3099</id>
		<title>Gás de Rede com Densidade Constante e dinâmica local</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_com_Densidade_Constante_e_din%C3%A2mica_local&amp;diff=3099"/>
		<updated>2020-11-26T19:03:52Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 *    			     Lattice Gas Cst				    *&lt;br /&gt;
 * 			      Pedro H Mendes				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			    	 INCLUDES				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include&amp;lt;math.h&amp;gt;&lt;br /&gt;
#include&amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			        DEFINITIONS				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
#define 			L				16&lt;br /&gt;
#define				L2				(L*L)&lt;br /&gt;
#define 			RHO				0.25&lt;br /&gt;
#define 			EPSILON				(1.0)&lt;br /&gt;
#define				TRAN				100000&lt;br /&gt;
#define 			TMAX				1000000&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			     GLOBAL VARIABLES				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
int site[L2], neigh[L2][5];&lt;br /&gt;
int ET, dE;&lt;br /&gt;
int density;&lt;br /&gt;
double boltz[4];&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			        FUNCTIONS				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void initialize(double TEMP);&lt;br /&gt;
void monte_carlo_routine(void);&lt;br /&gt;
void update_neighbour(int k);&lt;br /&gt;
void density_function(void);&lt;br /&gt;
void gnu_plot(void);&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			       MAIN PROGRAM				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	int mcs;&lt;br /&gt;
	double TEMP;&lt;br /&gt;
	int SEED;&lt;br /&gt;
	char Arq1[100];&lt;br /&gt;
	FILE *arq1;&lt;br /&gt;
&lt;br /&gt;
	TEMP = atof(argv[1]);&lt;br /&gt;
	SEED= atoi(argv[2]);&lt;br /&gt;
&lt;br /&gt;
	/* srand(time(NULL)); */&lt;br /&gt;
	srand(SEED);&lt;br /&gt;
&lt;br /&gt;
	initialize(TEMP);&lt;br /&gt;
&lt;br /&gt;
	for(mcs=0; mcs&amp;lt;TRAN; mcs++)&lt;br /&gt;
	{&lt;br /&gt;
		monte_carlo_routine();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	sprintf(Arq1, &amp;quot;series_T%.3lfL%dS%d.dsf&amp;quot;, TEMP, L, SEED);&lt;br /&gt;
	arq1 = fopen(Arq1, &amp;quot;w&amp;quot;);&lt;br /&gt;
	fprintf(arq1, &amp;quot;#MCS\tET\tdensity\t%d\n&amp;quot;, SEED);&lt;br /&gt;
&lt;br /&gt;
	for(mcs=0; mcs&amp;lt;TMAX; mcs++)&lt;br /&gt;
	{&lt;br /&gt;
		monte_carlo_routine();&lt;br /&gt;
		density_function();&lt;br /&gt;
		fprintf(arq1, &amp;quot;%d\t%d\t%d\n&amp;quot;, mcs, ET, density);&lt;br /&gt;
#ifdef GNU&lt;br /&gt;
		if(mcs%10 == 0) &lt;br /&gt;
		{&lt;br /&gt;
			printf(&amp;quot;set title &#039;Tempo = %d MCS\n&amp;quot;, mcs);&lt;br /&gt;
			gnu_plot();&lt;br /&gt;
		}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	fclose(arq1);&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			      INITIALIZATION				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void initialize(double TEMP)&lt;br /&gt;
{&lt;br /&gt;
	int i, j;&lt;br /&gt;
&lt;br /&gt;
	boltz[1] = exp(-1.0/TEMP);&lt;br /&gt;
	boltz[2] = exp(-2.0/TEMP);&lt;br /&gt;
	boltz[3] = exp(-3.0/TEMP);&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;L2; i++)&lt;br /&gt;
	{&lt;br /&gt;
		site[i] = 0;&lt;br /&gt;
		&lt;br /&gt;
		for(j=0; j&amp;lt;5; j++)&lt;br /&gt;
		{	&lt;br /&gt;
			neigh[i][j] = 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;(RHO*L2); i++)  &lt;br /&gt;
	{&lt;br /&gt;
		j = rand()%L2;	&lt;br /&gt;
		site[j] = 1;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	ET = 0;&lt;br /&gt;
	density = 0;&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;L2; i++)&lt;br /&gt;
	{&lt;br /&gt;
		neigh[i][0] = (i-L+L2)%L2;&lt;br /&gt;
		neigh[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
		neigh[i][2] = (i+L)%L2;&lt;br /&gt;
		neigh[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
&lt;br /&gt;
		for(j=0; j&amp;lt;4; j++)&lt;br /&gt;
		{&lt;br /&gt;
			neigh[i][4] += site[neigh[i][j]];&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ET += site[i]*neigh[i][4];&lt;br /&gt;
&lt;br /&gt;
		density += site[i];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ET = -ET/2;&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			      MONTE CARLO ROUTINE			    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void monte_carlo_routine(void)&lt;br /&gt;
{&lt;br /&gt;
	int i, j, k, t;&lt;br /&gt;
	int s_i, s_j;&lt;br /&gt;
	int sum_i, sum_j;&lt;br /&gt;
	int site_aux;&lt;br /&gt;
	int Ei, Ef;&lt;br /&gt;
	double r, flip_prob;&lt;br /&gt;
&lt;br /&gt;
	for(t=0; t&amp;lt;L2; t++)&lt;br /&gt;
	{&lt;br /&gt;
		i = rand()%L2;&lt;br /&gt;
		k = rand()%4;&lt;br /&gt;
		j = neigh[i][k];&lt;br /&gt;
&lt;br /&gt;
		s_i = site[i];&lt;br /&gt;
		s_j = site[j];&lt;br /&gt;
		&lt;br /&gt;
		if(s_i != s_j)&lt;br /&gt;
		{&lt;br /&gt;
			sum_i = neigh[i][4];&lt;br /&gt;
			sum_j = neigh[j][4];&lt;br /&gt;
	&lt;br /&gt;
			Ei = -sum_i*s_i - sum_j*s_j;&lt;br /&gt;
&lt;br /&gt;
			sum_i = sum_i + s_i - s_j;&lt;br /&gt;
			sum_j = sum_j + s_j - s_i; &lt;br /&gt;
	&lt;br /&gt;
			Ef = -sum_i*s_j - sum_j*s_i;&lt;br /&gt;
	&lt;br /&gt;
			dE = 0;&lt;br /&gt;
			dE = Ef-Ei;&lt;br /&gt;
&lt;br /&gt;
			if(dE &amp;lt;= 0)&lt;br /&gt;
			{&lt;br /&gt;
				site_aux = site[i];&lt;br /&gt;
				site[i] = site[j];&lt;br /&gt;
				site[j] = site_aux;&lt;br /&gt;
	&lt;br /&gt;
				ET += dE;&lt;br /&gt;
	&lt;br /&gt;
				update_neighbour(i);&lt;br /&gt;
				update_neighbour(j);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				flip_prob = boltz[dE];&lt;br /&gt;
				r = rand()/(double)RAND_MAX;&lt;br /&gt;
	&lt;br /&gt;
				if(r &amp;lt; flip_prob)&lt;br /&gt;
				{&lt;br /&gt;
					site_aux = site[i];&lt;br /&gt;
					site[i] = site[j];&lt;br /&gt;
					site[j] = site_aux;&lt;br /&gt;
						&lt;br /&gt;
					ET += dE;&lt;br /&gt;
	&lt;br /&gt;
					update_neighbour(i);&lt;br /&gt;
					update_neighbour(j);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			     UPDATE NEIGHBOURS			  	    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void update_neighbour(int k)&lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	&lt;br /&gt;
	for(i=0; i&amp;lt;4; i++)&lt;br /&gt;
	{&lt;br /&gt;
		neigh[neigh[k][i]][4] += 2*site[k] -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			     DENSITY FUNCTION			  	    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void density_function(void)&lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
&lt;br /&gt;
	density = 0;&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;L2; i++)&lt;br /&gt;
	{&lt;br /&gt;
		density += site[i];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 		    	       GNUPLOT VIEW		 	 	    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void gnu_plot(void)&lt;br /&gt;
{&lt;br /&gt;
	int ii,jj;&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;, (L-1), (L-1));&lt;br /&gt;
	printf(&amp;quot;set cbrange [0:4]\n&amp;quot;);&lt;br /&gt;
	printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
	printf(&amp;quot;set palette defined (0 &#039;black&#039;, 1 &#039;dark-violet&#039;)\n&amp;quot;);&lt;br /&gt;
	printf(&amp;quot;unset colorbox\n&amp;quot;);&lt;br /&gt;
	printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
	printf(&amp;quot;set key off\n&amp;quot;);&lt;br /&gt;
	printf(&amp;quot;plot \&amp;quot;-\&amp;quot; matrix w image\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	for(jj=0;jj&amp;lt;L;jj++)&lt;br /&gt;
	{&lt;br /&gt;
		for(ii=0;ii&amp;lt;L;ii++)&lt;br /&gt;
		{&lt;br /&gt;
			printf(&amp;quot;%d &amp;quot;, site[ii + jj*L]);&lt;br /&gt;
		}&lt;br /&gt;
		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;\ne\n pause 0.1\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_com_Densidade_Constante_e_din%C3%A2mica_local&amp;diff=3097</id>
		<title>Gás de Rede com Densidade Constante e dinâmica local</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_com_Densidade_Constante_e_din%C3%A2mica_local&amp;diff=3097"/>
		<updated>2020-11-26T19:01:03Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: Criou página com &amp;#039;/****************************************************************************  *    			     Lattice Gas Cst				    *  * 			      Pedro H Mendes				    *  *********************...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/****************************************************************************&lt;br /&gt;
 *    			     Lattice Gas Cst				    *&lt;br /&gt;
 * 			      Pedro H Mendes				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			    	 INCLUDES				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include&amp;lt;math.h&amp;gt;&lt;br /&gt;
#include&amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			        DEFINITIONS				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
#define 			L				16&lt;br /&gt;
#define				L2				(L*L)&lt;br /&gt;
#define 			RHO				0.25&lt;br /&gt;
#define 			EPSILON				(1.0)&lt;br /&gt;
#define				TRAN				100000&lt;br /&gt;
#define 			TMAX				1000000&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			     GLOBAL VARIABLES				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
int site[L2], neigh[L2][5];&lt;br /&gt;
int ET, dE;&lt;br /&gt;
int density;&lt;br /&gt;
double boltz[4];&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			        FUNCTIONS				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void initialize(double TEMP);&lt;br /&gt;
void monte_carlo_routine(void);&lt;br /&gt;
void update_neighbour(int k);&lt;br /&gt;
void density_function(void);&lt;br /&gt;
void gnu_plot(void);&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			       MAIN PROGRAM				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	int mcs;&lt;br /&gt;
	double TEMP;&lt;br /&gt;
	int SEED;&lt;br /&gt;
	char Arq1[100];&lt;br /&gt;
	FILE *arq1;&lt;br /&gt;
&lt;br /&gt;
	TEMP = atof(argv[1]);&lt;br /&gt;
	SEED= atoi(argv[2]);&lt;br /&gt;
&lt;br /&gt;
	/* srand(time(NULL)); */&lt;br /&gt;
	srand(SEED);&lt;br /&gt;
&lt;br /&gt;
	initialize(TEMP);&lt;br /&gt;
&lt;br /&gt;
	for(mcs=0; mcs&amp;lt;TRAN; mcs++)&lt;br /&gt;
	{&lt;br /&gt;
		monte_carlo_routine();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	sprintf(Arq1, &amp;quot;series_T%.3lfL%dS%d.dsf&amp;quot;, TEMP, L, SEED);&lt;br /&gt;
	arq1 = fopen(Arq1, &amp;quot;w&amp;quot;);&lt;br /&gt;
	fprintf(arq1, &amp;quot;#MCS\tET\tdensity\t%d\n&amp;quot;, SEED);&lt;br /&gt;
&lt;br /&gt;
	for(mcs=0; mcs&amp;lt;TMAX; mcs++)&lt;br /&gt;
	{&lt;br /&gt;
		monte_carlo_routine();&lt;br /&gt;
		density_function();&lt;br /&gt;
		fprintf(arq1, &amp;quot;%d\t%d\t%d\n&amp;quot;, mcs, ET, density);&lt;br /&gt;
#ifdef GNU&lt;br /&gt;
		if(mcs%10 == 0) &lt;br /&gt;
		{&lt;br /&gt;
			printf(&amp;quot;set title &#039;Tempo = %d MCS\n&amp;quot;, mcs);&lt;br /&gt;
			gnu_plot();&lt;br /&gt;
		}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	fclose(arq1);&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			      INITIALIZATION				    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void initialize(double TEMP)&lt;br /&gt;
{&lt;br /&gt;
	int i, j;&lt;br /&gt;
&lt;br /&gt;
	boltz[1] = exp(-1.0/TEMP);&lt;br /&gt;
	boltz[2] = exp(-2.0/TEMP);&lt;br /&gt;
	boltz[3] = exp(-3.0/TEMP);&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;L2; i++)&lt;br /&gt;
	{&lt;br /&gt;
		site[i] = 0;&lt;br /&gt;
		&lt;br /&gt;
		for(j=0; j&amp;lt;5; j++)&lt;br /&gt;
		{	&lt;br /&gt;
			neigh[i][j] = 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;(RHO*L2); i++)  &lt;br /&gt;
	{&lt;br /&gt;
		j = rand()%L2;	&lt;br /&gt;
		site[j] = 1;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	ET = 0;&lt;br /&gt;
	density = 0;&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;L2; i++)&lt;br /&gt;
	{&lt;br /&gt;
		neigh[i][0] = (i-L+L2)%L2;&lt;br /&gt;
		neigh[i][1] = (i+1)%L + (i/L)*L;&lt;br /&gt;
		neigh[i][2] = (i+L)%L2;&lt;br /&gt;
		neigh[i][3] = (i-1+L)%L + (i/L)*L;&lt;br /&gt;
&lt;br /&gt;
		for(j=0; j&amp;lt;4; j++)&lt;br /&gt;
		{&lt;br /&gt;
			neigh[i][4] += site[neigh[i][j]];&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ET += site[i]*neigh[i][4];&lt;br /&gt;
&lt;br /&gt;
		density += site[i];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ET = -ET/2;&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			      MONTE CARLO ROUTINE			    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void monte_carlo_routine(void)&lt;br /&gt;
{&lt;br /&gt;
	int i, j, k, t;&lt;br /&gt;
	int s_i, s_j;&lt;br /&gt;
	int sum_i, sum_j;&lt;br /&gt;
	int site_aux;&lt;br /&gt;
	int Ei, Ef;&lt;br /&gt;
	double r, flip_prob;&lt;br /&gt;
&lt;br /&gt;
	for(t=0; t&amp;lt;L2; t++)&lt;br /&gt;
	{&lt;br /&gt;
		i = rand()%L2;&lt;br /&gt;
		k = rand()%4;&lt;br /&gt;
		j = neigh[i][k];&lt;br /&gt;
&lt;br /&gt;
		s_i = site[i];&lt;br /&gt;
		s_j = site[j];&lt;br /&gt;
		&lt;br /&gt;
		if(s_i != s_j)&lt;br /&gt;
		{&lt;br /&gt;
			sum_i = neigh[i][4];&lt;br /&gt;
			sum_j = neigh[j][4];&lt;br /&gt;
	&lt;br /&gt;
			Ei = -sum_i*s_i - sum_j*s_j;&lt;br /&gt;
&lt;br /&gt;
			sum_i = sum_i + s_i - s_j;&lt;br /&gt;
			sum_j = sum_j + s_j - s_i; &lt;br /&gt;
	&lt;br /&gt;
			Ef = -sum_i*s_j - sum_j*s_i;&lt;br /&gt;
	&lt;br /&gt;
			dE = 0;&lt;br /&gt;
			dE = Ef-Ei;&lt;br /&gt;
&lt;br /&gt;
			if(dE &amp;lt;= 0)&lt;br /&gt;
			{&lt;br /&gt;
				site_aux = site[i];&lt;br /&gt;
				site[i] = site[j];&lt;br /&gt;
				site[j] = site_aux;&lt;br /&gt;
	&lt;br /&gt;
				ET += dE;&lt;br /&gt;
	&lt;br /&gt;
				update_neighbour(i);&lt;br /&gt;
				update_neighbour(j);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				flip_prob = boltz[dE];&lt;br /&gt;
				r = rand()/(double)RAND_MAX;&lt;br /&gt;
	&lt;br /&gt;
				if(r &amp;lt; flip_prob)&lt;br /&gt;
				{&lt;br /&gt;
					site_aux = site[i];&lt;br /&gt;
					site[i] = site[j];&lt;br /&gt;
					site[j] = site_aux;&lt;br /&gt;
						&lt;br /&gt;
					ET += dE;&lt;br /&gt;
	&lt;br /&gt;
					update_neighbour(i);&lt;br /&gt;
					update_neighbour(j);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			     UPDATE NEIGHBOURS			  	    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void update_neighbour(int k)&lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	&lt;br /&gt;
	for(i=0; i&amp;lt;4; i++)&lt;br /&gt;
	{&lt;br /&gt;
		neigh[neigh[k][i]][4] += 2*site[k] -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 			     DENSITY FUNCTION			  	    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void density_function(void)&lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
&lt;br /&gt;
	density = 0;&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;L2; i++)&lt;br /&gt;
	{&lt;br /&gt;
		density += site[i];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * 		    	       GNUPLOT VIEW		 	 	    *&lt;br /&gt;
 ***************************************************************************/&lt;br /&gt;
void gnu_plot(void)&lt;br /&gt;
{&lt;br /&gt;
	int ii,jj;&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;set xrange [0:%d]\nset yrange [0:%d]\n&amp;quot;, (L-1), (L-1));&lt;br /&gt;
	printf(&amp;quot;set cbrange [0:4]\n&amp;quot;);&lt;br /&gt;
	printf(&amp;quot;unset xtics\nunset ytics\n&amp;quot;);&lt;br /&gt;
	printf(&amp;quot;set palette defined (0 &#039;black&#039;, 1 &#039;dark-violet&#039;)\n&amp;quot;);&lt;br /&gt;
	printf(&amp;quot;unset colorbox\n&amp;quot;);&lt;br /&gt;
	printf(&amp;quot;set size square\n&amp;quot;);&lt;br /&gt;
	printf(&amp;quot;set key off\n&amp;quot;);&lt;br /&gt;
	printf(&amp;quot;plot \&amp;quot;-\&amp;quot; matrix w image\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	for(jj=0;jj&amp;lt;L;jj++)&lt;br /&gt;
	{&lt;br /&gt;
		for(ii=0;ii&amp;lt;L;ii++)&lt;br /&gt;
		{&lt;br /&gt;
			printf(&amp;quot;%d &amp;quot;, site[ii + jj*L]);&lt;br /&gt;
		}&lt;br /&gt;
		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;\ne\n pause 0.1\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3096</id>
		<title>Gás de Rede 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3096"/>
		<updated>2020-11-26T18:57:02Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &#039;&#039;&#039;EM CONSTRUÇÃO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Este trabalho tem o intuito de apresentar uma descrição do modelo do Gás de Rede bidimensional e traçar paralelos com o modelo de Ising, discutindo a relação entre seus Hamiltonianos.&lt;br /&gt;
&lt;br /&gt;
== Gás de Rede ==&lt;br /&gt;
&lt;br /&gt;
O Modelo do Gás de Rede 2D consiste em um sistema de &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas da forma &amp;lt;math&amp;gt;\sigma = {\sigma_1, \sigma_1, \dotsc, \sigma_N}&amp;lt;/math&amp;gt; onde cada sítio da rede pode assumir o valor &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, ocupado por uma partícula, ou &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;, não ocupado por uma partícula. A energia total do sistema é dada pelo Hamiltoniano do Gás de Rede, descrito pela equação&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \epsilon \sum_{\langle i,j \rangle} \sigma_i \sigma_j \qquad (1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde o somatório é dado entre os quatro vizinhos mais próximos e &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; é a constante de interação entre as partículas, para &amp;lt;math&amp;gt;\epsilon \geq 0&amp;lt;/math&amp;gt; a interação é atrativa. Por se tratar de uma rede quadrada com &amp;lt;math&amp;gt;L^2 = L \times L&amp;lt;/math&amp;gt; sítios, apenas uma parcela da rede é ocupada por partículas, ou seja, possuímos uma densidade constante &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; de partículas. Podemos expressar a condição da densidade constante da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} \sigma_i = \rho L^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazendo uma mudança de variáveis da forma &amp;lt;math&amp;gt;s_i = 2 \sigma_i - 1&amp;lt;/math&amp;gt; saímos da situação de ocupação e não ocupação de sítios e obtemos variáveis do Modelo de Ising &amp;lt;ref name=ISING&amp;gt; https://fiscomp.if.ufrgs.br/index.php/Ising_2D&amp;lt;/ref&amp;gt;, spins Up e Down. A variável &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; assume valor &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; (up) quando o sítio esta ocupado por uma partícula e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; quando não está. Aplicando a mudança de variáveis no Hamiltoniano do Gás de Rede obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} (s_i + 1)(s_j + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}[s_i s_j + s_i + s_j + 1]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Abrindo os termos dos três últimos somatórios se encontra que&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle}s_i = \sum_{\langle i,j \rangle}s_j = z \sum_{i}s_i&amp;lt;/math&amp;gt;, e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle} 1 = z L^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
o que simplifica a expressão para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{2} \epsilon z \sum_{i} s_i - \frac{1}{4} \epsilon z L^2 \qquad (2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; é o número de coordenação, isto é, o número de vizinhos de cada sítio, que para a rede quadrada é 4. Note a mudança no índice do somatório de &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Vemos que este Hamiltoniano possui a forma do Hamiltoniano do modelo de Ising com aplicação de um campo magnético externo, a menos de uma constante. Entretanto, com a densidade constante, fazendo a mesma mudança de variáveis, obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} s_i = (2\rho - 1) L^2 \qquad (3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicando essa relação no Hamiltoniano obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} s_i s_j - z \epsilon L^2 \rho  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; são constantes, o segundo termo é constante. Definindo &amp;lt;math&amp;gt;J = \epsilon / 4&amp;lt;/math&amp;gt; o Hamiltoniano se torna&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - J \sum_{\langle i,j \rangle} s_i s_j + \text{constante}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A constante não influencia nos valores da medida, pois ela se cancela na equação de mudança de estado &amp;lt;ref name=BARKEMA&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;. Vemos que, ao assumir a densidade constante, o modelo do Gás de Rede se torna o modelo de Ising sem a presença de um campo magnético. A condição da densidade constante é a magnetização total do modelo. &lt;br /&gt;
&lt;br /&gt;
É interessante notar que podemos tratar o modelo do gás de rede de duas formas: &#039;&#039;&#039;(a)&#039;&#039;&#039; assumir a densidade constante e utilizar o primeiro Hamiltoniano apresentado, ou &#039;&#039;&#039;(b)&#039;&#039;&#039; não assumir a densidade constante, aplicar a mudança de variáveis discutida e utilizar o Hamiltoniano que possuí a forma de Ising com campo magnético.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Método de Monte Carlo==&lt;br /&gt;
&lt;br /&gt;
===Princípios gerais===&lt;br /&gt;
&lt;br /&gt;
Para desenvolver a dinâmica do gás de rede, isto é, fazer com que ocorram alterações na posição das partículas, recorre-se ao método de Monte Carlo. Trata-se, em linhas gerais, de um método estatístico baseado em amostragem aleatória. É comum, ao introduzir-se o assunto, utilizar problemas de cálculo de áreas, como, por exemplo, a clássica história das crianças que desenharam, na areia, um círculo contido em um quadrado, de modo que o diâmetro do círculo seja igual ao lado do quadrado. Jogam, aleatoriamente, pedras no quadrado. Após uma grande quantidade de arremessos, compara-se o valor de pedras que estão dentro do círculo com o número total dentro do quadrado, fazendo a razão entre esses dois valores, encontra-se uma aproximação para a razão entre a área do círculo e a do quadrado, que equivale a &amp;lt;math&amp;gt;\pi/4&amp;lt;/math&amp;gt;. Desse modo, pode ser encontrada uma aproximação do valor de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; através do método de Monte Carlo, que simula uma aproximação experimental&amp;lt;ref name=KRAUTH&amp;gt;Krauth ,W. ,&amp;quot;Statistical Mechanics: Algorithms and Computations&amp;quot;. Oxford Master Series in Physics, Oxford University Press, 2006.&amp;lt;/ref&amp;gt;. É possível propor um novo modelo, no qual o quadrado é grande e as pedras são atiradas aleatoriamente de dentro do quadrado, de modo que a posição de arremesso é atualizada para a posição da última pedra jogada. A principal alteração nesse método é a possibilidade de que uma pedra seja atirada para fora do quadrado. Nesse caso, a posição para o próximo arremesso não muda e as pedras que foram parar fora das bordas do quadrado são empilhadas naquela posição. Essas mudanças no método caracterizam a aplicação de Monte Carlo em uma cadeia de Markov, definida de modo que a configuração do próximo estado depende somente da configuração atual. Até aqui, vimos o método de Monte Carlo aplicado em situações nas quais a probabilidade de um evento ocorrer na configuração subsequente do sistema é zero ou um. Para novas distribuições de probabilidade, utiliza-se o algoritmo de Metrópolis.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo de Metrópolis===&lt;br /&gt;
&lt;br /&gt;
Como mencionado, o método de Monte Carlo funciona através de atualizações em um sistema, fazendo com que ele passe de um estado para outro. Consideremos &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; como sendo o estado atual do sistema. O próximo estado será chamado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Chamamos a probabilidade do sistema passar do estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt;. A ideia do algoritmo de Metrópolis é aplicar essa probabilidade no método de Monte Carlo. Para isso, um método muito utilizado é calcular a probabilidade &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt; e compará-la a um número aleatório &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, de modo que &amp;lt;math&amp;gt;0&amp;lt;r&amp;lt;1&amp;lt;/math&amp;gt;. Se &amp;lt;math&amp;gt; p(\mu\to\nu)&amp;gt;r&amp;lt;/math&amp;gt;, então o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é adotado pelo sistema. Para aplicar essas ideias ao problema do gás de rede, o método mais simples é utilizando o algoritmo de Kawasaki, que faz com que dois sítios, selecionados aleatoriamente, tenham seus valores trocados. Isso implica que a magnetização do sistema será constante&amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;. Para calcular a probabilidade de aceitação dessa mudança, calcula-se a variação de energia entre os estados,&amp;lt;math&amp;gt;\Delta E= E_{\nu}-E_{\mu}&amp;lt;/math&amp;gt;, e aplica-se o valor obtido na equação de probabilidade de aceitação de Metrópolis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\mu\to\nu)=\left\{\begin{array}{rc} e^{\frac{-\Delta E}{k_BT}}, \quad \text{se}\quad \Delta E&amp;gt;0\\&lt;br /&gt;
1, \quad \text{caso contrario}\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, inicialmente foram feitas algumas alterações no algoritmo de Kawasaki. Limita-se a troca de valores somente entre um sítio e seus quatro vizinhos principais (isto é, acima, abaixo, à direita e à esquerda). Isso porque se tinha a intenção de recriar o comportamento difusivo de um gás no modelo do gás de rede em duas dimensões, porém, essa escolha para a dinâmica das simulações limita em muito a facilidade do sistema equilibrar, como será mostrado na parte de resultados. O algoritmo inicial consiste na seguinte ideia: No estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, seleciona-se aleatoriamente um sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. A partir dele, é sorteado um de seus vizinhos, digamos, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, com o qual haverá a troca de valor. Antes que ocorra a troca, são calculados os valores de dois Hamiltonianos: o que relaciona o sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; com seus vizinhos e o que relaciona &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; com seus vizinhos. Somados, eles representam o valor de &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt;. Após a troca, esses valores são recalculados, formando o valor de &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt;. Com esses valores, segue-se o cálculo da probabilidade da forma usual. &lt;br /&gt;
&lt;br /&gt;
Após verificar que a dinâmica inicialmente escolhida não era apropriada, optou-se por usar o algoritmo de Kawasaki tradicional, fazendo uso de uma listagem de quais eram os estados dos sítios e escolhendo os pares a serem trocados sempre como sítios de estados diferentes. Isso faz com que a aceitação do algoritmo de Monte Carlo seja muito mais elevada que ao do nosso algoritmo inicial, pois no caso em que grandes clusters são formados as trocas eram sempre rejeitadas de acordo com a dinâmica inicial.&lt;br /&gt;
&lt;br /&gt;
===Considerações práticas===&lt;br /&gt;
&lt;br /&gt;
Já consideramos os aspectos iniciais do método de Monte Carlo, mostrando suas aplicações. Vimos, do mesmo modo, a utilização do algoritmo de Metrópolis, dentro do qual aplicamos o algoritmo de Kawasaki (modificado) para desenvolver o sistema do gás de rede. Resta elucidar a função do parâmetro temporal, isto é, como as iterações desses algoritmos influenciam o sistema. Primeiramente, deve-se fixar um valor para o número de passos temporais que serão realizados. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações  do algoritmo de Metrópolis, abordado acima, sendo &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; o lado da rede quadrada. Chamamos de Passo de Monte Carlo (MCS) cada um desses passos temporais. Em outras palavras: em cada passo de Monte Carlo, todos os sítios tem a possibilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
=== Eficiência da dinâmica local ===&lt;br /&gt;
&lt;br /&gt;
Como mencionado acima, a primeira dinâmica escolhida foi a que restringe os sítios a trocarem de estado para apenas aqueles que são vizinhos próximos (os 4 acima, abaixo, a direita e a esquerda). Se verificou ao analisar os dados das simulações que na verdade essa dinâmica não era apropriada, pois a aceitação do algoritmo é muito baixa e com a amostragem escolhida (&amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS) o sistema ainda não estaria equilibrado. Isso pode ser percebido mais facilmente observando os histogramas das simulações. Sabe-se que a distribuição das grandezas macroscópicas de um sistema termodinâmico é a distribuição de Boltzmann &amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, então se espera para o sistema analisado que a energia tenha uma distribuição normal de frequências. Observe a diferença entre as distribuições para a energia do sistema no caso da dinâmica local inicialmente escolhida e no caso do algoritmo tradicional de Kawasaki:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Diferença entre distribuições para a energia do sistema por dinâmica escolhida.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Assim podemos notar que o sistema não está equilibrado após a amostragem com a dinâmica local. No caso do algoritmo tradicional o sistema se encontra em equilíbrio. A referência na qual esse trabalho mais se inspira, Monte Carlo Methods in Statistical Physics, de Newman e Barkema, não dá a devida ênfase para quão interessante computacionalmente é se manter na linguagem do modelo de Ising e adotar o algoritmo de Kawasaki.&lt;br /&gt;
É importante notar que as simulações da dinâmica de Kawasaki foram feitas na linguagem do modelo de Ising, com spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, ao invés de sítios ocupados por partículas &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; e sítios desocupados &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Essa mudança é importante para entender a mudança na escala das grandezas entre as simulações. Como a constante de interação &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; do modelo de Ising é um quarto da constante &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, a temperatura e a energia no modelo de Ising valem &amp;lt;math&amp;gt;\frac{1}{4}&amp;lt;/math&amp;gt; da temperatura e da energia nas simulações com a dinâmica local na linguagem do gás de rede.&lt;br /&gt;
&lt;br /&gt;
=== Energia e efeito do tamanho da rede ===&lt;br /&gt;
&lt;br /&gt;
A grandeza que foi medida nas simulações é a energia total do sistema. Para analisar os efeitos do tamanho da rede devemos comparar os valores das energias por número de sítios, já que quanto maior a rede maior o número de partículas e portanto maior o valor absoluto da energia. Abaixo temos um gráfico com os valores da energia total do sistema por número de sítios em função da temperatura, com os dados das três redes simuladas (L = 16, 32, 64).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:energia.png|thumb|center|none|alt=Alt text|Energia total do sistema dividida pelo número de sítios em função da temperatura para redes de tamanhos diferentes. Cada ponto no gráfico é a média de 5 amostragens com seu desvio padrão.|480px]]&lt;br /&gt;
&lt;br /&gt;
Aqui o comportamento da energia é como esperado para o modelo. Há uma queda no valor da energia conforme a temperatura do reservatório diminui abaixo da temperatura crítica, e conforme a temperatura aumenta acima da temperatura crítica, a energia aumenta mais devagar dado que é o estado em que o sistema está na sua fase amorfa.&lt;br /&gt;
&lt;br /&gt;
Algo que se nota no gráfico acima é a diferença nos valores da energia das redes &amp;lt;math&amp;gt;L = 32&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. É perceptível que as duas redes maiores apresentam valores de energia muito mais próximos. Isso se dá justamente pelo tamanho da rede e o fato da densidade ser a mesma.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:rede16.png|thumb|center|upright=4|none|alt= Alt text|Diagrama ilustrando o estado de menor energia para a rede de 16. As cores indicam o número de sítios vizinhos ocupados.|480px]]&lt;br /&gt;
&lt;br /&gt;
Para entender como o valor da energia total do sistema por número de sítios varia com o tamanho da rede é interessante calcular essa grandeza no estado de menor energia. No caso da rede quadrada, o estado de menor energia é um cluster quadrado. Como ilustrado no diagrama acima, existem sítios com 3 vizinhos ocupados e sítios com 2 vizinhos ocupados. Estes são os da borda do cluster. Todos os outros internos ao cluster tem 4 vizinhos ocupados e portanto contribuem com &amp;lt;math&amp;gt;-4\epsilon&amp;lt;/math&amp;gt; para o Hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
Nesse trabalho adotamos &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt;, o que facilita o cálculo da energia total, pois o tamanho do lado do cluster é &amp;lt;math&amp;gt; l = \sqrt{\frac{L^2}{4}}&amp;lt;/math&amp;gt;. Temos &amp;lt;math&amp;gt;(l - 2)^2&amp;lt;/math&amp;gt; partículas internas ao cluster e portanto com 4 vizinhos e &amp;lt;math&amp;gt;4(l - 2)&amp;lt;/math&amp;gt; partículas nas bordas com 3 vizinhos. O Hamiltoniano é portanto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = (-2\epsilon)*4 + (-3\epsilon)*4(l - 2) + (-4\epsilon)(l - 2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O primeiro termo é a referente às interações dos 4 cantos do cluster, que tem apenas 2 vizinhos ocupados. Abrindo os termos e simplificando a equação chegamos ao valor do Hamiltoniano do estado de menor energia do gás de rede:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = -(L^2 - 2L)\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo por 2 para encontrar o valor da energia total e então por &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;e = \frac{E}{L^2} = - \frac{\epsilon}{2} + \frac{\epsilon}{L}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
que é a grandeza apresentada no gráfico anterior. Essa elaboração foi feita para o modelo do gás de rede, porém as simulações foram feitas com o modelo de Ising, com a restrição de que a magnetização era constante (a quantidade de spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é constante).&lt;br /&gt;
&lt;br /&gt;
Usando a equação &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;J = \frac{\epsilon}{4}&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J\sum{i}s_i - 4JL^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utilizamos então a equação &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt; e percebemos que os termos do meio e da direita se cancelam, deixando somente o primeiro termo para avaliarmos em termos do estado de menor energia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J(2\rho - 1)L^2 - 4JL^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; = -J\sum_{\langle i, j \rangle}s_i s_j &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora podemos avaliar o Hamiltoniano do estado de menor energia do modelo de Ising nessas condições. Para isso podemos nos basear no diagrama usado anteriormente, com a ressalva de que os sítios imediatamente fora do cluster também interagem com ele, já que temos agora spins &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; ao invés de sítios vazios. Temos o mesmo número de spins internos ao cluster que de pariculas anteriormente, assim como para as bordas do cluster e os mesmos quatro cantos. Além disso, os sítios fora do cluster também tem contribuição para o Hamiltoniano. O número de spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;L^2 - \frac{L^2}{4} - 2L&amp;lt;/math&amp;gt; e o número de spins fora do cluster com 1 vizinho &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; é &amp;lt;math&amp;gt;2L&amp;lt;/math&amp;gt;. Agora podemos somar todas essas contribuições.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = (-4J)(L^2 - \frac{L^2}{4} - 2L) + (-2J)(2L) + (-2J)*4(\frac{L}{2} - 2) + (-4J)(\frac{L}{2} - 2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da esquerda para a direita os termos são a contribuição dos spins fora do cluster com 4 vizinhos &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, dos spins fora do cluster mas com um vizinho no cluster, dos spins na borda do cluster e dos spins interiores ao cluster. Abrindo os termos e simplificando a equação chegamos finalmente em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -(4L^2 - 8L)J&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E como nas simulações foram utilizadas que &amp;lt;math&amp;gt;\epsilon = 1&amp;lt;/math&amp;gt; para o caso do gás de rede e &amp;lt;math&amp;gt;J = 1&amp;lt;/math&amp;gt; para o modelo de Ising, temos portanto que as energias medidas com o modelo de Ising são equivalentes a 4 vezes as energias no modelo do gás de rede, como se verificou ao implementar a mesma função de medida para a linguagem de spins e de sítios vazios e ocupados.&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é a temperatura do banho térmico e o terceiro é a semente utilizada pelo gerador de números pseudo-aleatórios. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DGNU prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP SEED | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede com Densidade Constante e dinâmica local]]&lt;br /&gt;
&lt;br /&gt;
[[Modelo de ising com magnetização constante e algoritmo de Kawasaki]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3095</id>
		<title>Gás de Rede 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3095"/>
		<updated>2020-11-26T06:57:57Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &#039;&#039;&#039;EM CONSTRUÇÃO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Este trabalho tem o intuito de apresentar uma descrição do modelo do Gás de Rede bidimensional e traçar paralelos com o modelo de Ising, discutindo a relação entre seus Hamiltonianos.&lt;br /&gt;
&lt;br /&gt;
== Gás de Rede ==&lt;br /&gt;
&lt;br /&gt;
O Modelo do Gás de Rede 2D consiste em um sistema de &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas da forma &amp;lt;math&amp;gt;\sigma = {\sigma_1, \sigma_1, \dotsc, \sigma_N}&amp;lt;/math&amp;gt; onde cada sítio da rede pode assumir o valor &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, ocupado por uma partícula, ou &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;, não ocupado por uma partícula. A energia total do sistema é dada pelo Hamiltoniano do Gás de Rede, descrito pela equação&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \epsilon \sum_{\langle i,j \rangle} \sigma_i \sigma_j \qquad (1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde o somatório é dado entre os quatro vizinhos mais próximos e &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; é a constante de interação entre as partículas, para &amp;lt;math&amp;gt;\epsilon \geq 0&amp;lt;/math&amp;gt; a interação é atrativa. Por se tratar de uma rede quadrada com &amp;lt;math&amp;gt;L^2 = L \times L&amp;lt;/math&amp;gt; sítios, apenas uma parcela da rede é ocupada por partículas, ou seja, possuímos uma densidade constante &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; de partículas. Podemos expressar a condição da densidade constante da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} \sigma_i = \rho L^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazendo uma mudança de variáveis da forma &amp;lt;math&amp;gt;s_i = 2 \sigma_i - 1&amp;lt;/math&amp;gt; saímos da situação de ocupação e não ocupação de sítios e obtemos variáveis do Modelo de Ising &amp;lt;ref name=ISING&amp;gt; https://fiscomp.if.ufrgs.br/index.php/Ising_2D&amp;lt;/ref&amp;gt;, spins Up e Down. A variável &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; assume valor &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; (up) quando o sítio esta ocupado por uma partícula e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; quando não está. Aplicando a mudança de variáveis no Hamiltoniano do Gás de Rede obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} (s_i + 1)(s_j + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}[s_i s_j + s_i + s_j + 1]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Abrindo os termos dos três últimos somatórios se encontra que&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle}s_i = \sum_{\langle i,j \rangle}s_j = z \sum_{i}s_i&amp;lt;/math&amp;gt;, e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle} 1 = z L^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
o que simplifica a expressão para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{2} \epsilon z \sum_{i} s_i - \frac{1}{4} \epsilon z L^2 \qquad (2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; é o número de coordenação, isto é, o número de vizinhos de cada sítio, que para a rede quadrada é 4. Note a mudança no índice do somatório de &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Vemos que este Hamiltoniano possui a forma do Hamiltoniano do modelo de Ising com aplicação de um campo magnético externo, a menos de uma constante. Entretanto, com a densidade constante, fazendo a mesma mudança de variáveis, obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} s_i = (2\rho - 1) L^2 \qquad (3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicando essa relação no Hamiltoniano obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} s_i s_j - z \epsilon L^2 \rho  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; são constantes, o segundo termo é constante. Definindo &amp;lt;math&amp;gt;J = \epsilon / 4&amp;lt;/math&amp;gt; o Hamiltoniano se torna&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - J \sum_{\langle i,j \rangle} s_i s_j + \text{constante}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A constante não influencia nos valores da medida, pois ela se cancela na equação de mudança de estado &amp;lt;ref name=BARKEMA&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;. Vemos que, ao assumir a densidade constante, o modelo do Gás de Rede se torna o modelo de Ising sem a presença de um campo magnético. A condição da densidade constante é a magnetização total do modelo. &lt;br /&gt;
&lt;br /&gt;
É interessante notar que podemos tratar o modelo do gás de rede de duas formas: &#039;&#039;&#039;(a)&#039;&#039;&#039; assumir a densidade constante e utilizar o primeiro Hamiltoniano apresentado, ou &#039;&#039;&#039;(b)&#039;&#039;&#039; não assumir a densidade constante, aplicar a mudança de variáveis discutida e utilizar o Hamiltoniano que possuí a forma de Ising com campo magnético.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Método de Monte Carlo==&lt;br /&gt;
&lt;br /&gt;
===Princípios gerais===&lt;br /&gt;
&lt;br /&gt;
Para desenvolver a dinâmica do gás de rede, isto é, fazer com que ocorram alterações na posição das partículas, recorre-se ao método de Monte Carlo. Trata-se, em linhas gerais, de um método estatístico baseado em amostragem aleatória. É comum, ao introduzir-se o assunto, utilizar problemas de cálculo de áreas, como, por exemplo, a clássica história das crianças que desenharam, na areia, um círculo contido em um quadrado, de modo que o diâmetro do círculo seja igual ao lado do quadrado. Jogam, aleatoriamente, pedras no quadrado. Após uma grande quantidade de arremessos, compara-se o valor de pedras que estão dentro do círculo com o número total dentro do quadrado, fazendo a razão entre esses dois valores, encontra-se uma aproximação para a razão entre a área do círculo e a do quadrado, que equivale a &amp;lt;math&amp;gt;\pi/4&amp;lt;/math&amp;gt;. Desse modo, pode ser encontrada uma aproximação do valor de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; através do método de Monte Carlo, que simula uma aproximação experimental&amp;lt;ref name=KRAUTH&amp;gt;Krauth ,W. ,&amp;quot;Statistical Mechanics: Algorithms and Computations&amp;quot;. Oxford Master Series in Physics, Oxford University Press, 2006.&amp;lt;/ref&amp;gt;. É possível propor um novo modelo, no qual o quadrado é grande e as pedras são atiradas aleatoriamente de dentro do quadrado, de modo que a posição de arremesso é atualizada para a posição da última pedra jogada. A principal alteração nesse método é a possibilidade de que uma pedra seja atirada para fora do quadrado. Nesse caso, a posição para o próximo arremesso não muda e as pedras que foram parar fora das bordas do quadrado são empilhadas naquela posição. Essas mudanças no método caracterizam a aplicação de Monte Carlo em uma cadeia de Markov, definida de modo que a configuração do próximo estado depende somente da configuração atual. Até aqui, vimos o método de Monte Carlo aplicado em situações nas quais a probabilidade de um evento ocorrer na configuração subsequente do sistema é zero ou um. Para novas distribuições de probabilidade, utiliza-se o algoritmo de Metrópolis.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo de Metrópolis===&lt;br /&gt;
&lt;br /&gt;
Como mencionado, o método de Monte Carlo funciona através de atualizações em um sistema, fazendo com que ele passe de um estado para outro. Consideremos &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; como sendo o estado atual do sistema. O próximo estado será chamado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Chamamos a probabilidade do sistema passar do estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt;. A ideia do algoritmo de Metrópolis é aplicar essa probabilidade no método de Monte Carlo. Para isso, um método muito utilizado é calcular a probabilidade &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt; e compará-la a um número aleatório &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, de modo que &amp;lt;math&amp;gt;0&amp;lt;r&amp;lt;1&amp;lt;/math&amp;gt;. Se &amp;lt;math&amp;gt; p(\mu\to\nu)&amp;gt;r&amp;lt;/math&amp;gt;, então o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é adotado pelo sistema. Para aplicar essas ideias ao problema do gás de rede, o método mais simples é utilizando o algoritmo de Kawasaki, que faz com que dois sítios, selecionados aleatoriamente, tenham seus valores trocados. Isso implica que a magnetização do sistema será constante&amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;. Para calcular a probabilidade de aceitação dessa mudança, calcula-se a variação de energia entre os estados,&amp;lt;math&amp;gt;\Delta E= E_{\nu}-E_{\mu}&amp;lt;/math&amp;gt;, e aplica-se o valor obtido na equação de probabilidade de aceitação de Metrópolis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\mu\to\nu)=\left\{\begin{array}{rc} e^{\frac{-\Delta E}{k_BT}}, \quad \text{se}\quad \Delta E&amp;gt;0\\&lt;br /&gt;
1, \quad \text{caso contrario}\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, inicialmente foram feitas algumas alterações no algoritmo de Kawasaki. Limita-se a troca de valores somente entre um sítio e seus quatro vizinhos principais (isto é, acima, abaixo, à direita e à esquerda). Isso porque se tinha a intenção de recriar o comportamento difusivo de um gás no modelo do gás de rede em duas dimensões, porém, essa escolha para a dinâmica das simulações limita em muito a facilidade do sistema equilibrar, como será mostrado na parte de resultados. O algoritmo inicial consiste na seguinte ideia: No estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, seleciona-se aleatoriamente um sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. A partir dele, é sorteado um de seus vizinhos, digamos, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, com o qual haverá a troca de valor. Antes que ocorra a troca, são calculados os valores de dois Hamiltonianos: o que relaciona o sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; com seus vizinhos e o que relaciona &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; com seus vizinhos. Somados, eles representam o valor de &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt;. Após a troca, esses valores são recalculados, formando o valor de &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt;. Com esses valores, segue-se o cálculo da probabilidade da forma usual. &lt;br /&gt;
&lt;br /&gt;
Após verificar que a dinâmica inicialmente escolhida não era apropriada, optou-se por usar o algoritmo de Kawasaki tradicional, fazendo uso de uma listagem de quais eram os estados dos sítios e escolhendo os pares a serem trocados sempre como sítios de estados diferentes. Isso faz com que a aceitação do algoritmo de Monte Carlo seja muito mais elevada que ao do nosso algoritmo inicial, pois no caso em que grandes clusters são formados as trocas eram sempre rejeitadas de acordo com a dinâmica inicial.&lt;br /&gt;
&lt;br /&gt;
===Considerações práticas===&lt;br /&gt;
&lt;br /&gt;
Já consideramos os aspectos iniciais do método de Monte Carlo, mostrando suas aplicações. Vimos, do mesmo modo, a utilização do algoritmo de Metrópolis, dentro do qual aplicamos o algoritmo de Kawasaki (modificado) para desenvolver o sistema do gás de rede. Resta elucidar a função do parâmetro temporal, isto é, como as iterações desses algoritmos influenciam o sistema. Primeiramente, deve-se fixar um valor para o número de passos temporais que serão realizados. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações  do algoritmo de Metrópolis, abordado acima, sendo &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; o lado da rede quadrada. Chamamos de Passo de Monte Carlo (MCS) cada um desses passos temporais. Em outras palavras: em cada passo de Monte Carlo, todos os sítios tem a possibilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
=== Eficiência da dinâmica local ===&lt;br /&gt;
&lt;br /&gt;
Como mencionado acima, a primeira dinâmica escolhida foi a que restringe os sítios a trocarem de estado para apenas aqueles que são vizinhos próximos (os 4 acima, abaixo, a direita e a esquerda). Se verificou ao analisar os dados das simulações que na verdade essa dinâmica não era apropriada, pois a aceitação do algoritmo é muito baixa e com a amostragem escolhida (&amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS) o sistema ainda não estaria equilibrado. Isso pode ser percebido mais facilmente observando os histogramas das simulações. Sabe-se que a distribuição das grandezas macroscópicas de um sistema termodinâmico é a distribuição de Boltzmann &amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, então se espera para o sistema analisado que a energia tenha uma distribuição normal de frequências. Observe a diferença entre as distribuições para a energia do sistema no caso da dinâmica local inicialmente escolhida e no caso do algoritmo tradicional de Kawasaki:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Diferença entre distribuições para a energia do sistema por dinâmica escolhida.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Assim podemos notar que o sistema não está equilibrado após a amostragem com a dinâmica local. No caso do algoritmo tradicional o sistema se encontra em equilíbrio. A referência na qual esse trabalho mais se inspira, Monte Carlo Methods in Statistical Physics, de Newman e Barkema, não dá a devida ênfase para quão interessante computacionalmente é se manter na linguagem do modelo de Ising e adotar o algoritmo de Kawasaki.&lt;br /&gt;
É importante notar que as simulações da dinâmica de Kawasaki foram feitas na linguagem do modelo de Ising, com spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, ao invés de sítios ocupados por partículas &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; e sítios desocupados &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Essa mudança é importante para entender a mudança na escala das grandezas entre as simulações. Como a constante de interação &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; do modelo de Ising é um quarto da constante &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, a temperatura e a energia no modelo de Ising valem &amp;lt;math&amp;gt;\frac{1}{4}&amp;lt;/math&amp;gt; da temperatura e da energia nas simulações com a dinâmica local na linguagem do gás de rede.&lt;br /&gt;
&lt;br /&gt;
=== Energia e efeito do tamanho da rede ===&lt;br /&gt;
&lt;br /&gt;
A grandeza que foi medida nas simulações é a energia total do sistema. Para analisar os efeitos do tamanho da rede devemos comparar os valores das energias por número de sítios, já que quanto maior a rede maior o número de partículas e portanto maior o valor absoluto da energia. Abaixo temos um gráfico com os valores da energia total do sistema por número de sítios em função da temperatura, com os dados das três redes simuladas (L = 16, 32, 64).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:energia.png|thumb|center|none|alt=Alt text|Energia total do sistema dividida pelo número de sítios em função da temperatura para redes de tamanhos diferentes. Cada ponto no gráfico é a média de 5 amostragens com seu desvio padrão.|480px]]&lt;br /&gt;
&lt;br /&gt;
Aqui o comportamento da energia é como esperado para o modelo. Há uma queda no valor da energia conforme a temperatura do reservatório diminui abaixo da temperatura crítica, e conforme a temperatura aumenta acima da temperatura crítica, a energia aumenta mais devagar dado que é o estado em que o sistema está na sua fase amorfa.&lt;br /&gt;
&lt;br /&gt;
Algo que se nota no gráfico acima é a diferença nos valores da energia das redes &amp;lt;math&amp;gt;L = 32&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. É perceptível que as duas redes maiores apresentam valores de energia muito mais próximos. Isso se dá justamente pelo tamanho da rede e o fato da densidade ser a mesma.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:rede16.png|thumb|center|upright=4|none|alt= Alt text|Diagrama ilustrando o estado de menor energia para a rede de 16. As cores indicam o número de sítios vizinhos ocupados.|480px]]&lt;br /&gt;
&lt;br /&gt;
Para entender como o valor da energia total do sistema por número de sítios varia com o tamanho da rede é interessante calcular essa grandeza no estado de menor energia. No caso da rede quadrada, o estado de menor energia é um cluster quadrado. Como ilustrado no diagrama acima, existem sítios com 3 vizinhos ocupados e sítios com 2 vizinhos ocupados. Estes são os da borda do cluster. Todos os outros internos ao cluster tem 4 vizinhos ocupados e portanto contribuem com &amp;lt;math&amp;gt;-4\epsilon&amp;lt;/math&amp;gt; para o Hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
Nesse trabalho adotamos &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt;, o que facilita o cálculo da energia total, pois o tamanho do lado do cluster é &amp;lt;math&amp;gt; l = \sqrt{\frac{L^2}{4}}&amp;lt;/math&amp;gt;. Temos &amp;lt;math&amp;gt;(l - 2)^2&amp;lt;/math&amp;gt; partículas internas ao cluster e portanto com 4 vizinhos e &amp;lt;math&amp;gt;4(l - 2)&amp;lt;/math&amp;gt; partículas nas bordas com 3 vizinhos. O Hamiltoniano é portanto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = (-2\epsilon)*4 + (-3\epsilon)*4(l - 2) + (-4\epsilon)(l - 2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O primeiro termo é a referente às interações dos 4 cantos do cluster, que tem apenas 2 vizinhos ocupados. Abrindo os termos e simplificando a equação chegamos ao valor do Hamiltoniano do estado de menor energia do gás de rede:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = -(L^2 - 2L)\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo por 2 para encontrar o valor da energia total e então por &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;e = \frac{E}{L^2} = - \frac{\epsilon}{2} + \frac{\epsilon}{L}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
que é a grandeza apresentada no gráfico anterior. Essa elaboração foi feita para o modelo do gás de rede, porém as simulações foram feitas com o modelo de Ising, com a restrição de que a magnetização era constante (a quantidade de spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é constante).&lt;br /&gt;
&lt;br /&gt;
Usando a equação &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;J = \frac{\epsilon}{4}&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J\sum{i}s_i - 4JL^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utilizamos então a equação &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt; e percebemos que os termos do meio e da direita se cancelam, deixando somente o primeiro termo para avaliarmos em termos do estado de menor energia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J(2\rho - 1)L^2 - 4JL^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; = -J\sum_{\langle i, j \rangle}s_i s_j &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é a temperatura do banho térmico, argumento dos programas. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DGNU prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Ising com Campo]]&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede sem Densidade Constante]]&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede com Densidade Constante]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3094</id>
		<title>Gás de Rede 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3094"/>
		<updated>2020-11-26T06:57:01Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &#039;&#039;&#039;EM CONSTRUÇÃO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Este trabalho tem o intuito de apresentar uma descrição do modelo do Gás de Rede bidimensional e traçar paralelos com o modelo de Ising, discutindo a relação entre seus Hamiltonianos.&lt;br /&gt;
&lt;br /&gt;
== Gás de Rede ==&lt;br /&gt;
&lt;br /&gt;
O Modelo do Gás de Rede 2D consiste em um sistema de &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas da forma &amp;lt;math&amp;gt;\sigma = {\sigma_1, \sigma_1, \dotsc, \sigma_N}&amp;lt;/math&amp;gt; onde cada sítio da rede pode assumir o valor &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, ocupado por uma partícula, ou &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;, não ocupado por uma partícula. A energia total do sistema é dada pelo Hamiltoniano do Gás de Rede, descrito pela equação&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \epsilon \sum_{\langle i,j \rangle} \sigma_i \sigma_j \qquad (1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde o somatório é dado entre os quatro vizinhos mais próximos e &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; é a constante de interação entre as partículas, para &amp;lt;math&amp;gt;\epsilon \geq 0&amp;lt;/math&amp;gt; a interação é atrativa. Por se tratar de uma rede quadrada com &amp;lt;math&amp;gt;L^2 = L \times L&amp;lt;/math&amp;gt; sítios, apenas uma parcela da rede é ocupada por partículas, ou seja, possuímos uma densidade constante &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; de partículas. Podemos expressar a condição da densidade constante da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} \sigma_i = \rho L^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazendo uma mudança de variáveis da forma &amp;lt;math&amp;gt;s_i = 2 \sigma_i - 1&amp;lt;/math&amp;gt; saímos da situação de ocupação e não ocupação de sítios e obtemos variáveis do Modelo de Ising &amp;lt;ref name=ISING&amp;gt; https://fiscomp.if.ufrgs.br/index.php/Ising_2D&amp;lt;/ref&amp;gt;, spins Up e Down. A variável &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; assume valor &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; (up) quando o sítio esta ocupado por uma partícula e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; quando não está. Aplicando a mudança de variáveis no Hamiltoniano do Gás de Rede obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} (s_i + 1)(s_j + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}[s_i s_j + s_i + s_j + 1]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Abrindo os termos dos três últimos somatórios se encontra que&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle}s_i = \sum_{\langle i,j \rangle}s_j = z \sum_{i}s_i&amp;lt;/math&amp;gt;, e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle} 1 = z L^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
o que simplifica a expressão para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{2} \epsilon z \sum_{i} s_i - \frac{1}{4} \epsilon z L^2 \qquad (2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; é o número de coordenação, isto é, o número de vizinhos de cada sítio, que para a rede quadrada é 4. Note a mudança no índice do somatório de &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Vemos que este Hamiltoniano possui a forma do Hamiltoniano do modelo de Ising com aplicação de um campo magnético externo, a menos de uma constante. Entretanto, com a densidade constante, fazendo a mesma mudança de variáveis, obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} s_i = (2\rho - 1) L^2 \qquad (3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicando essa relação no Hamiltoniano obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} s_i s_j - z \epsilon L^2 \rho  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; são constantes, o segundo termo é constante. Definindo &amp;lt;math&amp;gt;J = \epsilon / 4&amp;lt;/math&amp;gt; o Hamiltoniano se torna&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - J \sum_{\langle i,j \rangle} s_i s_j + \text{constante}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A constante não influencia nos valores da medida, pois ela se cancela na equação de mudança de estado &amp;lt;ref name=BARKEMA&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;. Vemos que, ao assumir a densidade constante, o modelo do Gás de Rede se torna o modelo de Ising sem a presença de um campo magnético. A condição da densidade constante é a magnetização total do modelo. &lt;br /&gt;
&lt;br /&gt;
É interessante notar que podemos tratar o modelo do gás de rede de duas formas: &#039;&#039;&#039;(a)&#039;&#039;&#039; assumir a densidade constante e utilizar o primeiro Hamiltoniano apresentado, ou &#039;&#039;&#039;(b)&#039;&#039;&#039; não assumir a densidade constante, aplicar a mudança de variáveis discutida e utilizar o Hamiltoniano que possuí a forma de Ising com campo magnético.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Método de Monte Carlo==&lt;br /&gt;
&lt;br /&gt;
===Princípios gerais===&lt;br /&gt;
&lt;br /&gt;
Para desenvolver a dinâmica do gás de rede, isto é, fazer com que ocorram alterações na posição das partículas, recorre-se ao método de Monte Carlo. Trata-se, em linhas gerais, de um método estatístico baseado em amostragem aleatória. É comum, ao introduzir-se o assunto, utilizar problemas de cálculo de áreas, como, por exemplo, a clássica história das crianças que desenharam, na areia, um círculo contido em um quadrado, de modo que o diâmetro do círculo seja igual ao lado do quadrado. Jogam, aleatoriamente, pedras no quadrado. Após uma grande quantidade de arremessos, compara-se o valor de pedras que estão dentro do círculo com o número total dentro do quadrado, fazendo a razão entre esses dois valores, encontra-se uma aproximação para a razão entre a área do círculo e a do quadrado, que equivale a &amp;lt;math&amp;gt;\pi/4&amp;lt;/math&amp;gt;. Desse modo, pode ser encontrada uma aproximação do valor de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; através do método de Monte Carlo, que simula uma aproximação experimental&amp;lt;ref name=KRAUTH&amp;gt;Krauth ,W. ,&amp;quot;Statistical Mechanics: Algorithms and Computations&amp;quot;. Oxford Master Series in Physics, Oxford University Press, 2006.&amp;lt;/ref&amp;gt;. É possível propor um novo modelo, no qual o quadrado é grande e as pedras são atiradas aleatoriamente de dentro do quadrado, de modo que a posição de arremesso é atualizada para a posição da última pedra jogada. A principal alteração nesse método é a possibilidade de que uma pedra seja atirada para fora do quadrado. Nesse caso, a posição para o próximo arremesso não muda e as pedras que foram parar fora das bordas do quadrado são empilhadas naquela posição. Essas mudanças no método caracterizam a aplicação de Monte Carlo em uma cadeia de Markov, definida de modo que a configuração do próximo estado depende somente da configuração atual. Até aqui, vimos o método de Monte Carlo aplicado em situações nas quais a probabilidade de um evento ocorrer na configuração subsequente do sistema é zero ou um. Para novas distribuições de probabilidade, utiliza-se o algoritmo de Metrópolis.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo de Metrópolis===&lt;br /&gt;
&lt;br /&gt;
Como mencionado, o método de Monte Carlo funciona através de atualizações em um sistema, fazendo com que ele passe de um estado para outro. Consideremos &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; como sendo o estado atual do sistema. O próximo estado será chamado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Chamamos a probabilidade do sistema passar do estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt;. A ideia do algoritmo de Metrópolis é aplicar essa probabilidade no método de Monte Carlo. Para isso, um método muito utilizado é calcular a probabilidade &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt; e compará-la a um número aleatório &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, de modo que &amp;lt;math&amp;gt;0&amp;lt;r&amp;lt;1&amp;lt;/math&amp;gt;. Se &amp;lt;math&amp;gt; p(\mu\to\nu)&amp;gt;r&amp;lt;/math&amp;gt;, então o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é adotado pelo sistema. Para aplicar essas ideias ao problema do gás de rede, o método mais simples é utilizando o algoritmo de Kawasaki, que faz com que dois sítios, selecionados aleatoriamente, tenham seus valores trocados. Isso implica que a magnetização do sistema será constante&amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;. Para calcular a probabilidade de aceitação dessa mudança, calcula-se a variação de energia entre os estados,&amp;lt;math&amp;gt;\Delta E= E_{\nu}-E_{\mu}&amp;lt;/math&amp;gt;, e aplica-se o valor obtido na equação de probabilidade de aceitação de Metrópolis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\mu\to\nu)=\left\{\begin{array}{rc} e^{\frac{-\Delta E}{k_BT}}, \quad \text{se}\quad \Delta E&amp;gt;0\\&lt;br /&gt;
1, \quad \text{caso contrario}\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, inicialmente foram feitas algumas alterações no algoritmo de Kawasaki. Limita-se a troca de valores somente entre um sítio e seus quatro vizinhos principais (isto é, acima, abaixo, à direita e à esquerda). Isso porque se tinha a intenção de recriar o comportamento difusivo de um gás no modelo do gás de rede em duas dimensões, porém, essa escolha para a dinâmica das simulações limita em muito a facilidade do sistema equilibrar, como será mostrado na parte de resultados. O algoritmo inicial consiste na seguinte ideia: No estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, seleciona-se aleatoriamente um sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. A partir dele, é sorteado um de seus vizinhos, digamos, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, com o qual haverá a troca de valor. Antes que ocorra a troca, são calculados os valores de dois Hamiltonianos: o que relaciona o sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; com seus vizinhos e o que relaciona &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; com seus vizinhos. Somados, eles representam o valor de &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt;. Após a troca, esses valores são recalculados, formando o valor de &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt;. Com esses valores, segue-se o cálculo da probabilidade da forma usual. &lt;br /&gt;
&lt;br /&gt;
Após verificar que a dinâmica inicialmente escolhida não era apropriada, optou-se por usar o algoritmo de Kawasaki tradicional, fazendo uso de uma listagem de quais eram os estados dos sítios e escolhendo os pares a serem trocados sempre como sítios de estados diferentes. Isso faz com que a aceitação do algoritmo de Monte Carlo seja muito mais elevada que ao do nosso algoritmo inicial, pois no caso em que grandes clusters são formados as trocas eram sempre rejeitadas de acordo com a dinâmica inicial.&lt;br /&gt;
&lt;br /&gt;
===Considerações práticas===&lt;br /&gt;
&lt;br /&gt;
Já consideramos os aspectos iniciais do método de Monte Carlo, mostrando suas aplicações. Vimos, do mesmo modo, a utilização do algoritmo de Metrópolis, dentro do qual aplicamos o algoritmo de Kawasaki (modificado) para desenvolver o sistema do gás de rede. Resta elucidar a função do parâmetro temporal, isto é, como as iterações desses algoritmos influenciam o sistema. Primeiramente, deve-se fixar um valor para o número de passos temporais que serão realizados. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações  do algoritmo de Metrópolis, abordado acima, sendo &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; o lado da rede quadrada. Chamamos de Passo de Monte Carlo (MCS) cada um desses passos temporais. Em outras palavras: em cada passo de Monte Carlo, todos os sítios tem a possibilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
=== Eficiência da dinâmica local ===&lt;br /&gt;
&lt;br /&gt;
Como mencionado acima, a primeira dinâmica escolhida foi a que restringe os sítios a trocarem de estado para apenas aqueles que são vizinhos próximos (os 4 acima, abaixo, a direita e a esquerda). Se verificou ao analisar os dados das simulações que na verdade essa dinâmica não era apropriada, pois a aceitação do algoritmo é muito baixa e com a amostragem escolhida (&amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS) o sistema ainda não estaria equilibrado. Isso pode ser percebido mais facilmente observando os histogramas das simulações. Sabe-se que a distribuição das grandezas macroscópicas de um sistema termodinâmico é a distribuição de Boltzmann &amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, então se espera para o sistema analisado que a energia tenha uma distribuição normal de frequências. Observe a diferença entre as distribuições para a energia do sistema no caso da dinâmica local inicialmente escolhida e no caso do algoritmo tradicional de Kawasaki:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Diferença entre distribuições para a energia do sistema por dinâmica escolhida.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Assim podemos notar que o sistema não está equilibrado após a amostragem com a dinâmica local. No caso do algoritmo tradicional o sistema se encontra em equilíbrio. A referência na qual esse trabalho mais se inspira, Monte Carlo Methods in Statistical Physics, de Newman e Barkema, não dá a devida ênfase para quão interessante computacionalmente é se manter na linguagem do modelo de Ising e adotar o algoritmo de Kawasaki.&lt;br /&gt;
É importante notar que as simulações da dinâmica de Kawasaki foram feitas na linguagem do modelo de Ising, com spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, ao invés de sítios ocupados por partículas &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; e sítios desocupados &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Essa mudança é importante para entender a mudança na escala das grandezas entre as simulações. Como a constante de interação &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; do modelo de Ising é um quarto da constante &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, a temperatura e a energia no modelo de Ising valem &amp;lt;math&amp;gt;\frac{1}{4}&amp;lt;/math&amp;gt; da temperatura e da energia nas simulações com a dinâmica local na linguagem do gás de rede.&lt;br /&gt;
&lt;br /&gt;
=== Energia e efeito do tamanho da rede ===&lt;br /&gt;
&lt;br /&gt;
A grandeza que foi medida nas simulações é a energia total do sistema. Para analisar os efeitos do tamanho da rede devemos comparar os valores das energias por número de sítios, já que quanto maior a rede maior o número de partículas e portanto maior o valor absoluto da energia. Abaixo temos um gráfico com os valores da energia total do sistema por número de sítios em função da temperatura, com os dados das três redes simuladas (L = 16, 32, 64).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:energia.png|thumb|center|none|alt=Alt text|Energia total do sistema dividida pelo número de sítios em função da temperatura para redes de tamanhos diferentes. Cada ponto no gráfico é a média de 5 amostragens com seu desvio padrão.|480px]]&lt;br /&gt;
&lt;br /&gt;
Aqui o comportamento da energia é como esperado para o modelo. Há uma queda no valor da energia conforme a temperatura do reservatório diminui abaixo da temperatura crítica, e conforme a temperatura aumenta acima da temperatura crítica, a energia aumenta mais devagar dado que é o estado em que o sistema está na sua fase amorfa.&lt;br /&gt;
&lt;br /&gt;
Algo que se nota no gráfico acima é a diferença nos valores da energia das redes &amp;lt;math&amp;gt;L = 32&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. É perceptível que as duas redes maiores apresentam valores de energia muito mais próximos. Isso se dá justamente pelo tamanho da rede e o fato da densidade ser a mesma.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:rede16.png|thumb|center|upright=4|none|alt= Alt text|Diagrama ilustrando o estado de menor energia para a rede de 16. As cores indicam o número de sítios vizinhos ocupados.|480px]]&lt;br /&gt;
&lt;br /&gt;
Para entender como o valor da energia total do sistema por número de sítios varia com o tamanho da rede é interessante calcular essa grandeza no estado de menor energia. No caso da rede quadrada, o estado de menor energia é um cluster quadrado. Como ilustrado no diagrama acima, existem sítios com 3 vizinhos ocupados e sítios com 2 vizinhos ocupados. Estes são os da borda do cluster. Todos os outros internos ao cluster tem 4 vizinhos ocupados e portanto contribuem com &amp;lt;math&amp;gt;-4\epsilon&amp;lt;/math&amp;gt; para o Hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
Nesse trabalho adotamos &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt;, o que facilita o cálculo da energia total, pois o tamanho do lado do cluster é &amp;lt;math&amp;gt; l = \sqrt{\frac{L^2}{4}}&amp;lt;/math&amp;gt;. Temos &amp;lt;math&amp;gt;(l - 2)^2&amp;lt;/math&amp;gt; partículas internas ao cluster e portanto com 4 vizinhos e &amp;lt;math&amp;gt;4(l - 2)&amp;lt;/math&amp;gt; partículas nas bordas com 3 vizinhos. O Hamiltoniano é portanto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = (-2\epsilon)*4 + (-3\epsilon)*4(l - 2) + (-4\epsilon)(l - 2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O primeiro termo é a referente às interações dos 4 cantos do cluster, que tem apenas 2 vizinhos ocupados. Abrindo os termos e simplificando a equação chegamos ao valor do Hamiltoniano do estado de menor energia do gás de rede:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = -(L^2 - 2L)\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo por 2 para encontrar o valor da energia total e então por &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;e = \frac{E}{L^2} = - \frac{\epsilon}{2} + \frac{\epsilon}{L}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
que é a grandeza apresentada no gráfico anterior. Essa elaboração foi feita para o modelo do gás de rede, porém as simulações foram feitas com o modelo de Ising, com a restrição de que a magnetização era constante (a quantidade de spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é constante).&lt;br /&gt;
&lt;br /&gt;
Usando a equação &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;J = \frac{\epsilon}{4}&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J\sum{i}s_i - 4JL^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utilizamos então a equação &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt; e percebemos que os termos do meio e da direita se cancelam, deixando somente o primeiro termo para avaliarmos em termos do estado de menor energia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{ising} = -J\sum_{\langle i, j \rangle}s_i s_j - 8J(2\rho - 1)L^2 - 4JL^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math = -J\sum_{\langle i, j \rangle}s_i s_j&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é a temperatura do banho térmico, argumento dos programas. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DGNU prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Ising com Campo]]&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede sem Densidade Constante]]&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede com Densidade Constante]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3093</id>
		<title>Gás de Rede 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=G%C3%A1s_de_Rede_2D&amp;diff=3093"/>
		<updated>2020-11-26T06:55:58Z</updated>

		<summary type="html">&lt;p&gt;Joaomesquita: Desfeita a edição 3092 de Joaomesquita (Discussão)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &#039;&#039;&#039;EM CONSTRUÇÃO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Este trabalho tem o intuito de apresentar uma descrição do modelo do Gás de Rede bidimensional e traçar paralelos com o modelo de Ising, discutindo a relação entre seus Hamiltonianos.&lt;br /&gt;
&lt;br /&gt;
== Gás de Rede ==&lt;br /&gt;
&lt;br /&gt;
O Modelo do Gás de Rede 2D consiste em um sistema de &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas da forma &amp;lt;math&amp;gt;\sigma = {\sigma_1, \sigma_1, \dotsc, \sigma_N}&amp;lt;/math&amp;gt; onde cada sítio da rede pode assumir o valor &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, ocupado por uma partícula, ou &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;, não ocupado por uma partícula. A energia total do sistema é dada pelo Hamiltoniano do Gás de Rede, descrito pela equação&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \epsilon \sum_{\langle i,j \rangle} \sigma_i \sigma_j \qquad (1)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde o somatório é dado entre os quatro vizinhos mais próximos e &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; é a constante de interação entre as partículas, para &amp;lt;math&amp;gt;\epsilon \geq 0&amp;lt;/math&amp;gt; a interação é atrativa. Por se tratar de uma rede quadrada com &amp;lt;math&amp;gt;L^2 = L \times L&amp;lt;/math&amp;gt; sítios, apenas uma parcela da rede é ocupada por partículas, ou seja, possuímos uma densidade constante &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; de partículas. Podemos expressar a condição da densidade constante da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} \sigma_i = \rho L^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazendo uma mudança de variáveis da forma &amp;lt;math&amp;gt;s_i = 2 \sigma_i - 1&amp;lt;/math&amp;gt; saímos da situação de ocupação e não ocupação de sítios e obtemos variáveis do Modelo de Ising &amp;lt;ref name=ISING&amp;gt; https://fiscomp.if.ufrgs.br/index.php/Ising_2D&amp;lt;/ref&amp;gt;, spins Up e Down. A variável &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; assume valor &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; (up) quando o sítio esta ocupado por uma partícula e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; quando não está. Aplicando a mudança de variáveis no Hamiltoniano do Gás de Rede obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} (s_i + 1)(s_j + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}[s_i s_j + s_i + s_j + 1]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_j - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Abrindo os termos dos três últimos somatórios se encontra que&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle}s_i = \sum_{\langle i,j \rangle}s_j = z \sum_{i}s_i&amp;lt;/math&amp;gt;, e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{\langle i,j \rangle} 1 = z L^2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
o que simplifica a expressão para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle}s_i s_j - \frac{1}{2} \epsilon z \sum_{i} s_i - \frac{1}{4} \epsilon z L^2 \qquad (2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; é o número de coordenação, isto é, o número de vizinhos de cada sítio, que para a rede quadrada é 4. Note a mudança no índice do somatório de &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt;. Vemos que este Hamiltoniano possui a forma do Hamiltoniano do modelo de Ising com aplicação de um campo magnético externo, a menos de uma constante. Entretanto, com a densidade constante, fazendo a mesma mudança de variáveis, obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i} s_i = (2\rho - 1) L^2 \qquad (3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicando essa relação no Hamiltoniano obtemos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - \frac{1}{4} \epsilon \sum_{\langle i,j \rangle} s_i s_j - z \epsilon L^2 \rho  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; são constantes, o segundo termo é constante. Definindo &amp;lt;math&amp;gt;J = \epsilon / 4&amp;lt;/math&amp;gt; o Hamiltoniano se torna&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H} = - J \sum_{\langle i,j \rangle} s_i s_j + \text{constante}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A constante não influencia nos valores da medida, pois ela se cancela na equação de mudança de estado &amp;lt;ref name=BARKEMA&amp;gt;M. E. J. Newman, G. T. Barkema, &amp;quot;Monte Carlo Methods in Statistical Physics&amp;quot;. Oxford University Press Inc., New York, 1999.&amp;lt;/ref&amp;gt;. Vemos que, ao assumir a densidade constante, o modelo do Gás de Rede se torna o modelo de Ising sem a presença de um campo magnético. A condição da densidade constante é a magnetização total do modelo. &lt;br /&gt;
&lt;br /&gt;
É interessante notar que podemos tratar o modelo do gás de rede de duas formas: &#039;&#039;&#039;(a)&#039;&#039;&#039; assumir a densidade constante e utilizar o primeiro Hamiltoniano apresentado, ou &#039;&#039;&#039;(b)&#039;&#039;&#039; não assumir a densidade constante, aplicar a mudança de variáveis discutida e utilizar o Hamiltoniano que possuí a forma de Ising com campo magnético.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Método de Monte Carlo==&lt;br /&gt;
&lt;br /&gt;
===Princípios gerais===&lt;br /&gt;
&lt;br /&gt;
Para desenvolver a dinâmica do gás de rede, isto é, fazer com que ocorram alterações na posição das partículas, recorre-se ao método de Monte Carlo. Trata-se, em linhas gerais, de um método estatístico baseado em amostragem aleatória. É comum, ao introduzir-se o assunto, utilizar problemas de cálculo de áreas, como, por exemplo, a clássica história das crianças que desenharam, na areia, um círculo contido em um quadrado, de modo que o diâmetro do círculo seja igual ao lado do quadrado. Jogam, aleatoriamente, pedras no quadrado. Após uma grande quantidade de arremessos, compara-se o valor de pedras que estão dentro do círculo com o número total dentro do quadrado, fazendo a razão entre esses dois valores, encontra-se uma aproximação para a razão entre a área do círculo e a do quadrado, que equivale a &amp;lt;math&amp;gt;\pi/4&amp;lt;/math&amp;gt;. Desse modo, pode ser encontrada uma aproximação do valor de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; através do método de Monte Carlo, que simula uma aproximação experimental&amp;lt;ref name=KRAUTH&amp;gt;Krauth ,W. ,&amp;quot;Statistical Mechanics: Algorithms and Computations&amp;quot;. Oxford Master Series in Physics, Oxford University Press, 2006.&amp;lt;/ref&amp;gt;. É possível propor um novo modelo, no qual o quadrado é grande e as pedras são atiradas aleatoriamente de dentro do quadrado, de modo que a posição de arremesso é atualizada para a posição da última pedra jogada. A principal alteração nesse método é a possibilidade de que uma pedra seja atirada para fora do quadrado. Nesse caso, a posição para o próximo arremesso não muda e as pedras que foram parar fora das bordas do quadrado são empilhadas naquela posição. Essas mudanças no método caracterizam a aplicação de Monte Carlo em uma cadeia de Markov, definida de modo que a configuração do próximo estado depende somente da configuração atual. Até aqui, vimos o método de Monte Carlo aplicado em situações nas quais a probabilidade de um evento ocorrer na configuração subsequente do sistema é zero ou um. Para novas distribuições de probabilidade, utiliza-se o algoritmo de Metrópolis.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo de Metrópolis===&lt;br /&gt;
&lt;br /&gt;
Como mencionado, o método de Monte Carlo funciona através de atualizações em um sistema, fazendo com que ele passe de um estado para outro. Consideremos &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; como sendo o estado atual do sistema. O próximo estado será chamado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;. Chamamos a probabilidade do sistema passar do estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt;. A ideia do algoritmo de Metrópolis é aplicar essa probabilidade no método de Monte Carlo. Para isso, um método muito utilizado é calcular a probabilidade &amp;lt;math&amp;gt;p(\mu\to\nu)&amp;lt;/math&amp;gt; e compará-la a um número aleatório &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, de modo que &amp;lt;math&amp;gt;0&amp;lt;r&amp;lt;1&amp;lt;/math&amp;gt;. Se &amp;lt;math&amp;gt; p(\mu\to\nu)&amp;gt;r&amp;lt;/math&amp;gt;, então o estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é adotado pelo sistema. Para aplicar essas ideias ao problema do gás de rede, o método mais simples é utilizando o algoritmo de Kawasaki, que faz com que dois sítios, selecionados aleatoriamente, tenham seus valores trocados. Isso implica que a magnetização do sistema será constante&amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;. Para calcular a probabilidade de aceitação dessa mudança, calcula-se a variação de energia entre os estados,&amp;lt;math&amp;gt;\Delta E= E_{\nu}-E_{\mu}&amp;lt;/math&amp;gt;, e aplica-se o valor obtido na equação de probabilidade de aceitação de Metrópolis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(\mu\to\nu)=\left\{\begin{array}{rc} e^{\frac{-\Delta E}{k_BT}}, \quad \text{se}\quad \Delta E&amp;gt;0\\&lt;br /&gt;
1, \quad \text{caso contrario}\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, inicialmente foram feitas algumas alterações no algoritmo de Kawasaki. Limita-se a troca de valores somente entre um sítio e seus quatro vizinhos principais (isto é, acima, abaixo, à direita e à esquerda). Isso porque se tinha a intenção de recriar o comportamento difusivo de um gás no modelo do gás de rede em duas dimensões, porém, essa escolha para a dinâmica das simulações limita em muito a facilidade do sistema equilibrar, como será mostrado na parte de resultados. O algoritmo inicial consiste na seguinte ideia: No estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, seleciona-se aleatoriamente um sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. A partir dele, é sorteado um de seus vizinhos, digamos, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, com o qual haverá a troca de valor. Antes que ocorra a troca, são calculados os valores de dois Hamiltonianos: o que relaciona o sítio &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; com seus vizinhos e o que relaciona &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; com seus vizinhos. Somados, eles representam o valor de &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt;. Após a troca, esses valores são recalculados, formando o valor de &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt;. Com esses valores, segue-se o cálculo da probabilidade da forma usual. &lt;br /&gt;
&lt;br /&gt;
Após verificar que a dinâmica inicialmente escolhida não era apropriada, optou-se por usar o algoritmo de Kawasaki tradicional, fazendo uso de uma listagem de quais eram os estados dos sítios e escolhendo os pares a serem trocados sempre como sítios de estados diferentes. Isso faz com que a aceitação do algoritmo de Monte Carlo seja muito mais elevada que ao do nosso algoritmo inicial, pois no caso em que grandes clusters são formados as trocas eram sempre rejeitadas de acordo com a dinâmica inicial.&lt;br /&gt;
&lt;br /&gt;
===Considerações práticas===&lt;br /&gt;
&lt;br /&gt;
Já consideramos os aspectos iniciais do método de Monte Carlo, mostrando suas aplicações. Vimos, do mesmo modo, a utilização do algoritmo de Metrópolis, dentro do qual aplicamos o algoritmo de Kawasaki (modificado) para desenvolver o sistema do gás de rede. Resta elucidar a função do parâmetro temporal, isto é, como as iterações desses algoritmos influenciam o sistema. Primeiramente, deve-se fixar um valor para o número de passos temporais que serão realizados. Em cada passo temporal, são realizadas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; iterações  do algoritmo de Metrópolis, abordado acima, sendo &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; o lado da rede quadrada. Chamamos de Passo de Monte Carlo (MCS) cada um desses passos temporais. Em outras palavras: em cada passo de Monte Carlo, todos os sítios tem a possibilidade de realizar uma troca.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
=== Eficiência da dinâmica local ===&lt;br /&gt;
&lt;br /&gt;
Como mencionado acima, a primeira dinâmica escolhida foi a que restringe os sítios a trocarem de estado para apenas aqueles que são vizinhos próximos (os 4 acima, abaixo, a direita e a esquerda). Se verificou ao analisar os dados das simulações que na verdade essa dinâmica não era apropriada, pois a aceitação do algoritmo é muito baixa e com a amostragem escolhida (&amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS) o sistema ainda não estaria equilibrado. Isso pode ser percebido mais facilmente observando os histogramas das simulações. Sabe-se que a distribuição das grandezas macroscópicas de um sistema termodinâmico é a distribuição de Boltzmann &amp;lt;ref name = BARKEMA&amp;gt;&amp;lt;/ref&amp;gt;, então se espera para o sistema analisado que a energia tenha uma distribuição normal de frequências. Observe a diferença entre as distribuições para a energia do sistema no caso da dinâmica local inicialmente escolhida e no caso do algoritmo tradicional de Kawasaki:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Diferença entre distribuições para a energia do sistema por dinâmica escolhida.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:hist_dinamica_local.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica local após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|[[Arquivo:hist_kawasaki.png|thumb|upright=4|none|alt=Alt text|Distribuição da energia para a dinâmica do algoritmo de Kawasaki após &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt; MCS.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Assim podemos notar que o sistema não está equilibrado após a amostragem com a dinâmica local. No caso do algoritmo tradicional o sistema se encontra em equilíbrio. A referência na qual esse trabalho mais se inspira, Monte Carlo Methods in Statistical Physics, de Newman e Barkema, não dá a devida ênfase para quão interessante computacionalmente é se manter na linguagem do modelo de Ising e adotar o algoritmo de Kawasaki.&lt;br /&gt;
É importante notar que as simulações da dinâmica de Kawasaki foram feitas na linguagem do modelo de Ising, com spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, ao invés de sítios ocupados por partículas &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; e sítios desocupados &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Essa mudança é importante para entender a mudança na escala das grandezas entre as simulações. Como a constante de interação &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; do modelo de Ising é um quarto da constante &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, a temperatura e a energia no modelo de Ising valem &amp;lt;math&amp;gt;\frac{1}{4}&amp;lt;/math&amp;gt; da temperatura e da energia nas simulações com a dinâmica local na linguagem do gás de rede.&lt;br /&gt;
&lt;br /&gt;
=== Energia e efeito do tamanho da rede ===&lt;br /&gt;
&lt;br /&gt;
A grandeza que foi medida nas simulações é a energia total do sistema. Para analisar os efeitos do tamanho da rede devemos comparar os valores das energias por número de sítios, já que quanto maior a rede maior o número de partículas e portanto maior o valor absoluto da energia. Abaixo temos um gráfico com os valores da energia total do sistema por número de sítios em função da temperatura, com os dados das três redes simuladas (L = 16, 32, 64).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:energia.png|thumb|center|none|alt=Alt text|Energia total do sistema dividida pelo número de sítios em função da temperatura para redes de tamanhos diferentes. Cada ponto no gráfico é a média de 5 amostragens com seu desvio padrão.|480px]]&lt;br /&gt;
&lt;br /&gt;
Aqui o comportamento da energia é como esperado para o modelo. Há uma queda no valor da energia conforme a temperatura do reservatório diminui abaixo da temperatura crítica, e conforme a temperatura aumenta acima da temperatura crítica, a energia aumenta mais devagar dado que é o estado em que o sistema está na sua fase amorfa.&lt;br /&gt;
&lt;br /&gt;
Algo que se nota no gráfico acima é a diferença nos valores da energia das redes &amp;lt;math&amp;gt;L = 32&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 64&amp;lt;/math&amp;gt; e a rede de &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt;. É perceptível que as duas redes maiores apresentam valores de energia muito mais próximos. Isso se dá justamente pelo tamanho da rede e o fato da densidade ser a mesma.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:rede16.png|thumb|center|upright=4|none|alt= Alt text|Diagrama ilustrando o estado de menor energia para a rede de 16. As cores indicam o número de sítios vizinhos ocupados.|480px]]&lt;br /&gt;
&lt;br /&gt;
Para entender como o valor da energia total do sistema por número de sítios varia com o tamanho da rede é interessante calcular essa grandeza no estado de menor energia. No caso da rede quadrada, o estado de menor energia é um cluster quadrado. Como ilustrado no diagrama acima, existem sítios com 3 vizinhos ocupados e sítios com 2 vizinhos ocupados. Estes são os da borda do cluster. Todos os outros internos ao cluster tem 4 vizinhos ocupados e portanto contribuem com &amp;lt;math&amp;gt;-4\epsilon&amp;lt;/math&amp;gt; para o Hamiltoniano.&lt;br /&gt;
&lt;br /&gt;
Nesse trabalho adotamos &amp;lt;math&amp;gt;\rho = 0.25&amp;lt;/math&amp;gt;, o que facilita o cálculo da energia total, pois o tamanho do lado do cluster é &amp;lt;math&amp;gt; l = \sqrt{\frac{L^2}{4}}&amp;lt;/math&amp;gt;. Temos &amp;lt;math&amp;gt;(l - 2)^2&amp;lt;/math&amp;gt; partículas internas ao cluster e portanto com 4 vizinhos e &amp;lt;math&amp;gt;4(l - 2)&amp;lt;/math&amp;gt; partículas nas bordas com 3 vizinhos. O Hamiltoniano é portanto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = (-2\epsilon)*4 + (-3\epsilon)*4(l - 2) + (-4\epsilon)(l - 2)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O primeiro termo é a referente às interações dos 4 cantos do cluster, que tem apenas 2 vizinhos ocupados. Abrindo os termos e simplificando a equação chegamos ao valor do Hamiltoniano do estado de menor energia do gás de rede:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathcal{H}_{GR} = -(L^2 - 2L)\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo por 2 para encontrar o valor da energia total e então por &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;e = \frac{E}{L^2} = - \frac{\epsilon}{2} + \frac{\epsilon}{L}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
que é a grandeza apresentada no gráfico anterior. Essa elaboração foi feita para o modelo do gás de rede, porém as simulações foram feitas com o modelo de Ising, com a restrição de que a magnetização era constante (a quantidade de spins &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; é constante).&lt;br /&gt;
&lt;br /&gt;
Usando a equação &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;J = \frac{\epsilon}{4}&amp;lt;/math&amp;gt; chegamos em&lt;br /&gt;
&lt;br /&gt;
== Programas Utilizados ==&lt;br /&gt;
&lt;br /&gt;
Programas na linguagem C. Para utilizar os programas, abra o terminal e compile da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &#039;&#039;prog.c&#039;&#039; é o programa que deseja utilizar. E execute da seguinte maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde o segundo termo é a temperatura do banho térmico, argumento dos programas. Os programas possuem uma diretiva de compilação para visualização do sistema ao decorrer da execução. Para utilizar é necessário ter o gnuplot &amp;lt;ref name=GNUPLOT&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Gnuplot&amp;lt;/ref&amp;gt; instalado e compilar da forma&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ gcc -DGNU prog.c -lm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e então executar da maneira&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
$ ./a.out TEMP | gnuplot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entretanto com a visualização no gnuplot o programa pode demorar mais para executar, então é recomendado diminuir os tempos de transiente (&#039;&#039;TRAN&#039;&#039;) e medidas (&#039;&#039;TMAX&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Ising com Campo]]&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede sem Densidade Constante]]&lt;br /&gt;
&lt;br /&gt;
[[Gás de Rede com Densidade Constante]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joaomesquita</name></author>
	</entry>
</feed>