function nc = spin2d(config,taux,n)
//     Simule un systeme de spin dont les taux sont
//     donnes dans une matrice a 2 lignes et 5 colonnes. 
//     La configuration est une matrice de booleens, 
//     les conditions de bord sont periodiques.
//     Retourne et represente graphiquement la configuration apres 
//     n iterations.

// initialisations
probas = taux/max(taux);                // probabilites de changement
nc = config;                            // configuration de depart    
[l,c] = size(config);                   // dimensions
// fonctions auxiliaires
deff("y=modx(x)",..                     // conditions de bord en abscisse
      "if x==0 then, y=l; elseif x==l+1 then, y=1; else y=x; end");
deff("y=mody(x)",..                     // conditions de bord en ordonnee
      "if x==0 then, y=c; elseif x==c+1 then, y=1; else y=x; end");
deff("n=voisins(x,y)",..                // nombre de voisins occupes
      "n=sum(bool2s([nc(modx(x-1),y),nc(modx(x+1),y),..
                     nc(x,mody(y-1)),nc(x,mody(y+1))]))");
// boucle principale
for i=1:n,                              // debut des iterations
     x=grand(1,1,"uin",1,l);            // abscisse au hasard 
     y=grand(1,1,"uin",1,c);            // ordonnee au hasard 
     p=probas(1+bool2s(nc(x,y)),..      // etat du site
              1+voisins(x,y));          // voisins occupes
     if rand(1,1)<p then,               // decision
            nc(x,y)=~nc(x,y)            // changement
     end;
end;                                    // fin des iterations
xbasc();
represente_config(nc);                  // representation graphique

function nc = represente_config(config)  
//    Represente une configuration de booleens
//    par des rectangles noirs et blancs.

nc = config;
[l,c] = size(config);
xbasc(); xset("pattern",0);
plotframe([0,0,l,c],[0,1,0,1],[%f,%f]);
for i=1:l,
   for j=1:c,
     if config(i,j) then,
        xfrect(i-1,j,1,1);
     end;
   end;
end;

      
        



