http://fiscomp.if.ufrgs.br/index.php?title=Potts_Metropolis&feed=atom&action=history
Potts Metropolis - Histórico de revisão
2024-03-29T04:47:29Z
Histórico de revisões para esta página neste wiki
MediaWiki 1.39.4
http://fiscomp.if.ufrgs.br/index.php?title=Potts_Metropolis&diff=4436&oldid=prev
Pedhmendes: Criou página com '<source lang = "c"> /***************************************************************************** * Potts Model 2D...'
2021-05-16T21:38:49Z
<p>Criou página com '<source lang = "c"> /***************************************************************************** * Potts Model 2D...'</p>
<p><b>Página nova</b></p><div><source lang = "c"><br />
/*****************************************************************************<br />
* Potts Model 2D *<br />
* Metropolis *<br />
****************************************************************************/<br />
<br />
/*****************************************************************************<br />
* INCLUDES *<br />
****************************************************************************/<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <math.h><br />
#include <time.h><br />
#include <string.h><br />
#include "mc.h"<br />
<br />
/*****************************************************************************<br />
* DEFINITIONS *<br />
****************************************************************************/<br />
#define L 64<br />
#define L2 (L*L)<br />
#define J 1.<br />
#define KB 1.<br />
#define TRAN 1//100000<br />
#define TMAX 1000000<br />
<br />
/*****************************************************************************<br />
* GLOBAL VARIABLES *<br />
****************************************************************************/<br />
int M, ET;<br />
<br />
/*****************************************************************************<br />
* FUNCTIONS *<br />
****************************************************************************/<br />
void initialize(int *spin, int **neigh, int **kronecker, int _Q);<br />
void sweep(int *spin, int **neigh, int **kronecker, int _Q, double _TEMP);<br />
void states(int *spin, int **neigh, int **kronecker, int _Q);<br />
void visualize(int *spin);<br />
<br />
/*****************************************************************************<br />
* MAIN PROGRAM *<br />
****************************************************************************/<br />
int main(int argc, char *argv[])<br />
{<br />
int *spin, **neigh, **kronecker;<br />
int i, mcs;<br />
int Q; <br />
double TEMP;<br />
<br />
Q = atoi(argv[1]);<br />
TEMP = atof(argv[2]);<br />
<br />
spin = (int*)malloc(L2*sizeof(int));<br />
neigh = (int**)malloc(L2*sizeof(int*));<br />
kronecker =(int**)malloc(Q*sizeof(int*));<br />
<br />
for(i=0; i<L2; i++)<br />
{<br />
neigh[i] = (int *)malloc(4*sizeof(int));<br />
}<br />
<br />
for(i=0; i<Q; i++)<br />
{<br />
kronecker[i] = (int*)malloc(Q*sizeof(int));<br />
}<br />
<br />
seed = start_randomic();<br />
<br />
initialize(spin, neigh, kronecker, Q);<br />
states(spin, neigh, kronecker, Q);<br />
<br />
for(mcs=0; mcs<TRAN; mcs++)<br />
{<br />
sweep(spin, neigh, kronecker, Q, TEMP); <br />
states(spin, neigh, kronecker, Q);<br />
}<br />
<br />
char Arq[100];<br />
FILE *arq;<br />
sprintf(Arq, "mp_Q%dL%dT%.3lf.dsf", Q, L, TEMP);<br />
arq = fopen(Arq, "w");<br />
fprintf(arq, "#SEED: %ld\n#MCS\tM\tET\n", seed);<br />
<br />
<br />
for(mcs=0; mcs<TMAX; mcs++) <br />
{<br />
sweep(spin, neigh, kronecker, Q, TEMP);<br />
states(spin, neigh, kronecker, Q);<br />
#ifdef VIEW <br />
if(mcs % 10 == 0)<br />
{<br />
printf("set title 'T = %d MCS'\n", mcs);<br />
visualize(spin);<br />
}<br />
#endif<br />
fprintf(arq, "%d\t%d\t%d\n", mcs, M, ET);<br />
<br />
}<br />
<br />
fclose(arq);<br />
<br />
return 0;<br />
}<br />
<br />
/*****************************************************************************<br />
* INITIALIZATION *<br />
****************************************************************************/<br />
void initialize(int *spin, int **neigh, int **kronecker, int _Q)<br />
{<br />
int i, j;<br />
<br />
for(i=0; i<L2; i++)<br />
{<br />
spin[i]=FRANDOM*_Q;<br />
}<br />
<br />
for(i=0; i<L2; i++)<br />
{<br />
neigh[i][0] = (i-L+L2)%L2;<br />
neigh[i][1] = (i+1)%L + (i/L)*L;<br />
neigh[i][2] = (i+L)%L2;<br />
neigh[i][3] = (i-1+L)%L + (i/L)*L;<br />
}<br />
<br />
for(i=0; i<_Q; i++)<br />
{<br />
for(j=0; j<_Q; j++)<br />
{<br />
if(i==j)<br />
{<br />
kronecker[i][j] = 1;<br />
}<br />
else<br />
{<br />
kronecker[i][j] = 0;<br />
}<br />
}<br />
}<br />
<br />
return;<br />
}<br />
/*****************************************************************************<br />
* MONTE CARLO ROUTINE *<br />
****************************************************************************/<br />
void sweep(int *spin, int **neigh, int **kronecker, int _Q, double _TEMP)<br />
{<br />
for (int i=0; i<L2; i++) <br />
{<br />
int site = FRANDOM*L2;<br />
int E1=0, E2 = 0;<br />
int new_state = FRANDOM*_Q;<br />
<br />
for(int j=0; j<4; j++)<br />
{<br />
E1 -= J*kronecker[spin[site]][spin[neigh[site][j]]];<br />
}<br />
<br />
for (int j=0; j<4; j++)<br />
{<br />
E2 -= J*kronecker[new_state][spin[neigh[site][j]]];<br />
}<br />
<br />
double dE = E2 - E1;<br />
<br />
if(dE <= 0)<br />
{<br />
spin[site] = new_state;<br />
}<br />
<br />
else<br />
{<br />
double r = FRANDOM;<br />
double ALPHA = exp(-dE/(KB*_TEMP)); <br />
<br />
if(r<=ALPHA) <br />
{ <br />
spin[site] = new_state;<br />
}<br />
}<br />
}<br />
<br />
return;<br />
}<br />
/*****************************************************************************<br />
* STATES *<br />
****************************************************************************/<br />
void states(int *spin, int **neigh, int **kronecker, int _Q)<br />
{<br />
int i, j;<br />
<br />
ET=0;<br />
M=0;<br />
<br />
if(_Q!=2)<br />
{<br />
for (i=0; i<L2; i++)<br />
{<br />
for(j=0; j<4; j++)<br />
{<br />
ET -=J*kronecker[spin[i]][spin[neigh[i][j]]];<br />
} <br />
<br />
M += spin[i];<br />
}<br />
}<br />
<br />
else<br />
{<br />
for(i=0; i<L2; i++)<br />
{<br />
for(j=0; j<4; j++)<br />
{<br />
ET -=J*kronecker[spin[i]][spin[neigh[i][j]]];<br />
} <br />
<br />
if(spin[i]==0)<br />
{<br />
M -= 1; <br />
}<br />
if(spin[i]==1)<br />
{<br />
M += 1; <br />
}<br />
}<br />
}<br />
<br />
return;<br />
}<br />
/*****************************************************************************<br />
* GNUPLOT VISUALIZATION *<br />
****************************************************************************/<br />
void visualize(int *spin)<br />
{<br />
int i;<br />
printf("unset xtics\nunset ytics\n"); <br />
printf("set size square\n");<br />
printf("set xrange [0:%d]\nset yrange [0:%d]\n",L-1,L-1);<br />
printf("pl '-' matrix w image\n");<br />
for(i=L2-1; i>=0; i--) <br />
{<br />
printf("%d ", spin[i]);<br />
if(i%L == 0)<br />
{<br />
printf("\n");<br />
}<br />
}<br />
<br />
printf("e\n\n");<br />
}<br />
<br />
</source></div>
Pedhmendes