#include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> #define sigma(i,j) _sigma[((j+L) % L) * L + ((i+L) % L)] void visualize(FILE * gp, int * conf, int L); int main(){ int L; int *_sigma; int i, j; double deltaH, Temp; int t, T, l; double m; double J; FILE *gp; L = 100; T = 1000; _sigma = calloc(L*L, sizeof(int)); J = 1; Temp = .01; gp = popen("gnuplot", "w"); fprintf(gp, "set size square; unset key; set cbrange [-1:1]\n"); srand48(time(NULL)); // inizializziamo a caso for (i=0; i<L; i++) { for (j=0; j<L; j++) { sigma(i,j) = drand48() < 0.5 ? -1 : 1; } } for (t=0; t<T; t++) { // passo MC for (l=0; l<L*L; l++) { //tentativi di cambio i = (int) (drand48() * L); j = (int) (drand48() * L); deltaH = sigma(i,j)* 2* J * (sigma(i-1,j)+sigma(i, j-1)+sigma(i+1,j) + sigma(i, j+1)); if (drand48() < exp(-deltaH/Temp)) { sigma(i,j) *= -1; } } visualize(gp, _sigma, L); } } void visualize(FILE * gp, int * c, int L) { fprintf(gp, "plot '-' binary array=%dx%d w image \n", L,L); fwrite(c, sizeof(int),L*L, gp); fflush(gp); }