#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);
}