#include #include #define L 4 #define V L*L #define MAX_ITER 100 #define DESTRA 0 #define ALTO 1 #define SINISTRA 2 #define BASSO 3 typedef unsigned long long RANDOM_TYPE; typedef char SPIN; #define MYRAND64 myrand64 = (6364136223846793005UL * myrand64) #define MASSIMO_RAND64 0XFFFFFFFFFFFFFFFFUL RANDOM_TYPE myrand64; double inv_massimo_rand64 = 1.0L / (double)MASSIMO_RAND64; unsigned long vicino[4][V]; struct s_cluster{ SPIN spin; struct s_cluster *prossimo; struct s_cluster *precedente; struct s_cluster *trisavolo; struct s_cluster *trisnipote; }cluster[V]; void my_init(void); void init_vicini(void); void init_random_spin(void); unsigned long site_update(long,long); void my_end(void); #define FAILURE -1 #define SUCCESS 1 /*****************************************************************************/ int main(void) { long i, j, done =0; unsigned long ho_cambiato; my_init(); init_vicini(); init_random_spin(); for(j=0; jprossimo){ puntatore->trisavolo = testa_minore; if(puntatore==puntatore->prossimo)break; } /* il discendente del cluster maggiore viene dato a tutti i siti del cluster minore */ for(puntatore=testa_minore; ; puntatore=puntatore->prossimo){ puntatore->trisnipote = coda_maggiore; if(puntatore==puntatore->prossimo)break; } /*il prossimo della coda del cluster minore e' l'antenato del cluster maggiore (che stiamo assorbendo) */ if(coda_minore->prossimo != coda_minore){ printf("interruzione programma: errore interno 1\n"); exit(-9); } coda_minore->prossimo = testa_maggiore; /*il precedente della coda del cluster maggiore e' il figlio del cluster minore (che sta prendendo il potere) */ if(testa_maggiore->precedente != testa_maggiore){ printf("interruzione programma: errore interno 2\n"); exit(-9); } testa_maggiore->precedente = coda_minore; } return cambio; } /****************************************************************************/ void init_vicini(void) { long x, y, i; for(x=0; x